我目前正在尝试使用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++)的最现代答案似乎不起作用。
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]
!