为什么 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::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* 是否是合适的替代方案.

编辑:一个简短的例子应该有助于理解这种误解。 0 的类型是什么?。这是一个 int'a' 的类型是什么?这是一个char"abc" 的类型是什么?不是 std::string,是 const char[4]!