int x = f();
inline int y = x;
未指定
y
是否为零或x
的值。
请注意,
x
具有有序初始化,而y
具有部分有序初始化(请参阅[basic.start.dynamic] p1)。
由于并非两者都具有有序初始化,并且由于 x
没有部分有序初始化,因此 [basic.start.dynamic] p3.1 不适用,并且它们的初始化是不确定排序的。
由于作者使用了措辞“W 没有无序初始化”,因此有序初始化并不意味着意味着部分有序初始化,否则这可以被简化。
作者也没有写 “如果 V 和 W 都没有无序初始化”,这会将 x
的 init 排在
y
之前。问题
P0386R2:内联变量没有解释这一点。
实践中的后果std::cout
初始化
std::__ioinit
相对于后面的任何
inline
变量是不确定地排序的:
// included from <iostream>:
namespace std {
// ...
extern ostream cout;
// libstdc++ implementation detail; initializes cout:
static ios_base::Init __ioinit;
}
// then, in our own code, possibly a header:
inline int x = [] {
std::cout << "awoo"; // possibly UB
return 0;
}();
extern int x;
inline int y = x;
可能出现在另一个翻译单元中,并且不能期望编译器知道y
甚至出现在定义
x
的翻译单元中。如果
x
具有internal 链接,当然,此逻辑不适用,但是不可能在多个翻译单元中定义
y
(除了具有常量
x
的旧黑客),并且它应该不是
inline
。