27 March 2022

C++ 核心指南目录

奇怪,13后面没有14,直接跳到22了。

理由:

复杂的初始化会导致执行顺序的不确定性。

例子:

// file1.c

extern const X x;

const Y y = f(x);   // read x; write y

// file2.c

extern const Y y;

const X x = g(y);   // read y; write x

因为 xy 在不同编译单元里, f()g() 的调用顺序不确定。其中一个函数会访问到一个未初始化的 const

注意:

在并发执行的代码中初始化顺序的问题会更加难处理。最好避免使用全局对象。

强化:

  • 标注调用非 constexpr 函数的全局初始化函数
  • 标注访问 extern 对象的全局初始化函数