gpt4 book ai didi

c++ - 为什么在类主体中不可能初始化静态常量字符串成员

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:28 25 4
gpt4 key购买 nike

我正在使用 C++ 14。我需要在类里面使用静态常量字符串。但是当我写

class myClass
{
static constexpr const std::string S="aa";
}

它不编译。编译器(g++)的结果是

type 'const string {aka const std::__cxx11::basic_string<char>}' of constexpr variable 'S::S' is not literal

如果我用像这样的字符指针来写它:

class myClass
{
static constexpr const *char S="aa";
}

已编译。

我知道字符串可以在类外初始化。我的问题是为什么第一个变体没有编译,第二个变体。我想知道标准是怎么说的。

最佳答案

char基础类型(C++14 草案 n4296 中引用 3.9.1 基础类型 [basic.fundamental])。它既没有构造函数也没有析构函数,可以在 constexpr 中使用.

另一方面,std::string是一个类类型。更确切地说,它是 basic_string 的特化。 , 即 basic_string<char> .和 basic_string类有很多构造函数,包括采用 const char * 的构造函数在您的代码中使用的参数,但未声明任何参数 constexpr , 所以你不能建立 constexpr std::string .这是有道理的,因为创建了一个 std::string远非微不足道,包括 char 数组的动态分配:

basic_string(const charT* s, const Allocator& a = Allocator());

... an allocated copy of the array whose first element is pointed at by s

但是恕我直言,正确的方法是声明一个数组:

class myClass
{
static constexpr const char S[] ="aa";
}
const char A::S[]; // do not forget to define the static element if it is later odr-used...

顺便说一句,静态数据成员如果稍后在程序中使用,则应在其类定义之外定义。实现通常允许不在类定义之外定义整数常量或指针(无论如何,一个定义规则不需要诊断,未定义的行为允许预期的结果),但严格的 C++ 语义不允许。

引用 C++14 的 n4296 草案:9.4.2 静态数据成员 [class.static.data] §3

If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignmentexpression is a constant expression (5.20). A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [ Note: In both these cases, the member may appear in constant expressions. —end note ] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.

关于c++ - 为什么在类主体中不可能初始化静态常量字符串成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45190999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com