为什么 std::is_literal_type<std::String> == false 以及如何绕过它?
Why does std::is_literal_type<std::String> == false and how can I get around it?
我目前正在尝试使用 constexpr
来定义一些输入标识内容:
struct RangeParams {
string legacyId;
string fullname;
string shortname;
float min = -1;
float baseline = 0;
float max = 1;
float defaultValue = 0;
};
...
inline constexpr RangeParams curve1 = { "some_id", "my_name", ...};
不幸的是,constexpr 行出现错误
Constexpr variable cannot have non-literal type 'const RangeParams'
所以,我深入研究它,找出其中哪一部分是非文字的,string
是罪魁祸首。
std::cout << std::is_literal_type<float>::value; // output: 1
std::cout << std::is_literal_type<string>::value; // output: 0
发现这一点对我来说突出了一个重要事实,即我对文字类型的理解相当有缺陷。在大多数情况下,我只是将它们视为基础知识(数字、字符串、布尔值、由这些东西构成的结构)。
那么为什么一个简单的字符串不是文字类型呢?这里有什么问题?
此外,我该如何解决这个问题?我正在尝试从我的 RangeParams 中创建一个全局变量,这个问题的最现代答案 (Defining global constant in C++) 似乎不起作用。
std::string
不是文字。 const char[]
是。陷阱是 std::string
是一个动态大小的容器。不,你不能绕过这个并仍然使用 std::string
。 std::string
在 constexpr 上下文中不可用。
您可能希望在代码中将 std::string
替换为 const char*
:
struct RangeParams {
const char* legacyId;
const char* fullname;
const char* shortname;
float min = -1;
float baseline = 0;
float max = 1;
float defaultValue = 0;
};
它并不完全相同,但由于缺乏上下文,很难证明您究竟需要 std::string
来做什么,因此不确定 const char*
是否是合适的替代方案.
编辑:一个简短的例子应该有助于理解这种误解。 0
的类型是什么?。这是一个 int
。 'a'
的类型是什么?这是一个char
。 "abc"
的类型是什么?不是 std::string
,是 const char[4]
!
我目前正在尝试使用 constexpr
来定义一些输入标识内容:
struct RangeParams {
string legacyId;
string fullname;
string shortname;
float min = -1;
float baseline = 0;
float max = 1;
float defaultValue = 0;
};
...
inline constexpr RangeParams curve1 = { "some_id", "my_name", ...};
不幸的是,constexpr 行出现错误
Constexpr variable cannot have non-literal type 'const RangeParams'
所以,我深入研究它,找出其中哪一部分是非文字的,string
是罪魁祸首。
std::cout << std::is_literal_type<float>::value; // output: 1
std::cout << std::is_literal_type<string>::value; // output: 0
发现这一点对我来说突出了一个重要事实,即我对文字类型的理解相当有缺陷。在大多数情况下,我只是将它们视为基础知识(数字、字符串、布尔值、由这些东西构成的结构)。
那么为什么一个简单的字符串不是文字类型呢?这里有什么问题?
此外,我该如何解决这个问题?我正在尝试从我的 RangeParams 中创建一个全局变量,这个问题的最现代答案 (Defining global constant in C++) 似乎不起作用。
std::string
不是文字。 const char[]
是。陷阱是 std::string
是一个动态大小的容器。不,你不能绕过这个并仍然使用 std::string
。 std::string
在 constexpr 上下文中不可用。
您可能希望在代码中将 std::string
替换为 const char*
:
struct RangeParams {
const char* legacyId;
const char* fullname;
const char* shortname;
float min = -1;
float baseline = 0;
float max = 1;
float defaultValue = 0;
};
它并不完全相同,但由于缺乏上下文,很难证明您究竟需要 std::string
来做什么,因此不确定 const char*
是否是合适的替代方案.
编辑:一个简短的例子应该有助于理解这种误解。 0
的类型是什么?。这是一个 int
。 'a'
的类型是什么?这是一个char
。 "abc"
的类型是什么?不是 std::string
,是 const char[4]
!