静态数据成员初始化顺序

Mar*_*tin 3 c++

在单个翻译单元中考虑以下代码:

class C {
private:

    struct Init {

        Init() {
            /* compute data once here */
        }
    };
    static const Init& i;
    static int data[];
public:
    /* interface for reading data */
};

const C::Init& C::i = Init();
int C::data[200];
Run Code Online (Sandbox Code Playgroud)
  1. C :: i总是在C :: data之后初始化,无论两者的定义顺序如何?
  2. 这个解决方案是一次计算静态数据最优雅的解决方案吗?

Ker*_* SB 6

int C::data[200]零初始化,这意味着它是静态初始化的.静态初始化在动态初始化之前.由于C::Init::Init()不是一个常量表达式,C::i被动态地初始化,一定 C::data.

详情见3.6.2.

盗版报价:

具有静态存储持续时间的变量应在任何其他初始化发生之前进行零初始化.[...]一起,零初始化和常量初始化称为静态初始化; 所有其他初始化是动态初始化.在进行任何动态初始化之前,应执行静态初始化.