为什么std :: is_literal_type ==假,我怎么能绕过它呢?

问题描述 投票:0回答:1

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

c++ string global-variables inline constexpr
1个回答
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*将是一个合适的选择。

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

© www.soinside.com 2019 - 2024. All rights reserved.