为什么std :: is_literal_type <std :: string> == false,我该如何解决?

时间:2019-02-21 00:39:41

标签: c++ string global-variables inline constexpr

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

1 个答案:

答案 0 :(得分:0)

std::string不是文字。 const char[]是。问题是std::string是动态大小的容器。不,您无法解决这个问题,仍然使用std::stringstd::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]