gpt4 book ai didi

c++ - constexpr 静态成员与变量

转载 作者:太空狗 更新时间:2023-10-29 21:41:43 24 4
gpt4 key购买 nike

我偶然发现了一些看起来像这样的 C++11 代码:

// some_file.h
namespace blah {
class X {
public:
constexpr const static std::initializer_list<uint64> SOME_LIST =
{1,2,3};
};
}

// some_file.cpp
#include "some_file.h"
namespace blah {
constexpr const std::initializer_list<uint64> X::SOME_LIST;
}

编译得很好。我假设 cpp 文件中的定义用于避免包含标题的每个文件中的符号重复(如果我错了请纠正我)。

然后我尝试了以下操作:

// my_file.h
namespace bleh {
constexpr const static char SOME_CONSTANT[] = "yay";
}

// my_file.cpp
#include "my_file.h"
namespace bleh {
// if I add this or any other variation, compilation breaks!
//constexpr const static char SOME_CONSTANT[];
}

如果我在 .cpp 文件中添加显式定义,上面的代码将不起作用。所以我想知道:第二种情况是否有符号重复?如果是这样,有没有办法在没有封闭类的情况下定义变量?

最佳答案

static 关键字在这里有两种不同的含义:

当您在文件范围(全局和/或命名空间范围)声明变量或函数时,static 关键字指定该变量或函数具有内部链接。当您声明一个变量时,该变量具有静态持续时间,除非您指定另一个值,否则编译器会将其初始化为 0。

当您在类声明中声明数据成员时,static 关键字指定该成员的一个拷贝由该类的所有实例共享。必须在文件范围内定义静态数据成员。您声明为 const static 的完整数据成员可以具有初始化程序。

C++ 需要您在某处定义静态类成员,因为类符号是全局的(您的成员也是)。由于多个定义,这无法在 header 中完成。

在第二种情况下,每个编译单元都使用自己的变量并且没有全局符号。

关于c++ - constexpr 静态成员与变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28226933/

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