小编adz*_*iri的帖子

类定义中的静态数据成员初始化?

我在这里有一个问题,那么,为什么(为了什么?)不可能在类中初始化静态变量?我管理的

http://eel.is/c++draft/class.static.data#3

如果非易失性非内联 const 静态数据成员是整数或枚举类型, 如果它在程序中被 odr 使用,...仍应在命名空间范围中定义,并且命名空间范围定义不应包含初始化程序。

所以,像这样的例子

struct X {
    static int const n = 7; // should be defined outside the class, 
                            // but it's compiles successfully
};
Run Code Online (Sandbox Code Playgroud)

我看到这个话题/sf/answers/1146200051/,给出了这样一个例子

struct s
{
    static std::size_t const len = 10;
    int arr[len];
};
std::size_t const s::len; 
Run Code Online (Sandbox Code Playgroud)

用这样的话——

“如果 len 没有在类定义中初始化,编译器就不能轻易知道它在下一行中的值来定义 arr 的长度。”

但实际上没有std::size_t const s::len - 这行它也编译成功,所以在什么情况下它不应该工作? https://gcc.godbolt.org/z/OMKzEO

所以我们更进一步,为什么我们不能在类内部初始化静态成员,const 限定符允许这样做,为什么没有我们做不到呢?const 做什么来允许在类内部初始化?

你可能会说我们不能在类内部初始化静态成员,因为 ODR 和 Stroustrup 所说的:

类通常在头文件中声明,而头文件通常包含在许多翻译单元中。但是,为了避免复杂的链接器规则,C++ 要求每个对象都有唯一的定义。如果 C++ 允许需要作为对象存储在内存中的实体的类内定义,那么这条规则就会被打破。

但事实并非如此,为什么编译器会解决模板类的静态成员在标头中(在翻译单元之外)初始化的事实?

// …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
868
查看次数

静态全局变量初始化顺序

在我在这里找到的许多答案都说了以下几个字:

单个转换单元(源文件)中的全局变量按其定义的顺序初始化.

要么

在同一个编译单元中,订单定义明确:与定义相同的顺序.

等等

但是我在哪里可以看到C++标准中的这些词?我想得到一个或几个具体的段落,其中描述了这种行为.我自己找不到,我不知道该问谁.

c++ initialization global-variables operator-precedence language-lawyer

4
推荐指数
1
解决办法
242
查看次数