C++内联/非内联变量初始化为何采用不确定顺序化?设计意图何在?
问题示例代码
int x = f(); inline int y = x;
这段代码中,无法确定y的初始值是0还是x的值。
初始化属性分析
x具备有序初始化属性,y具备部分有序初始化属性(参考C++标准[basic.start.dynamic]第1段)。由于二者并非都具备有序初始化属性,且x不具备部分有序初始化属性,[basic.start.dynamic]第3.1条款不适用,因此它们的初始化是不确定顺序化的。
从标准文本的表述“W does not have unordered initialization”可以推断,有序初始化并非隐含部分有序初始化,否则表述可被简化。标准也未采用“若V和W均不具备无序初始化属性”的表述,否则x的初始化会被排在y之前。
技术疑问
从上述分析来看,这种初始化顺序的设计是有意为之,但它的设计目的是什么?为何要在这类简单场景中采用不确定顺序化的初始化方式?提案P0386R2: Inline Variables中并未对此作出解释。
实际影响举例
比如,通过std::__ioinit完成的std::cout初始化,与后续任何inline变量的初始化是不确定顺序化的:
// 来自<iostream>的内容: namespace std { // ... extern ostream cout; // libstdc++实现细节:负责初始化cout static ios_base::Init __ioinit; } // 然后在我们自己的代码(可能是头文件)中: inline int x = [] { std::cout << "awoo"; // 可能属于未定义行为 return 0; }();
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

