我目前正在尝试使用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变量不能具有非文字类型'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++)的最现代答案似乎无效。
答案 0 :(得分:0)
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*
将是一个合适的选择。 / p>
编辑:一个简短的例子应该有助于理解误解。 0
是什么类型?这是int
。 'a'
是什么类型?这是char
。 "abc"
是什么类型?不是std::string
,而是const char[4]
!