【发布时间】:2020-09-18 16:17:46
【问题描述】:
这主要是一个好奇心驱动的问题,我不打算写这样的代码。 这是my answer关于动态初始化顺序的后续。
根据我在答案中的介绍,内联静态成员变量按照它们的类在源代码中出现的顺序进行初始化如果这样的顺序在它们所在的所有翻译单元 (TU) 中都是相同的都出现了。
此外,[basic.start.dynamic]-3.1 部分适用于部分有序(其他内联静态)和有序变量。这意味着在同一个 TU 中的普通全局变量。
所以,给出这个例子:
//A.hpp
struct A{
inline static int a=foo();// Some function with possible side-effects
};
//B.hpp
struct B{
inline static int b=foo();
};
//X.cpp
int x1 = foo();
#include "A.hpp"
int x2 = foo();
#include "B.hpp"
int x3 = foo();
//Y.cpp
int y1 = foo();
#include "A.hpp"
int y2 = foo();
#include "B.hpp"
int y3 = foo();
变量是否按以下顺序初始化?
-
(x1,y1)未确定顺序, -
a, -
(x2,y2)顺序不定, -
b, -
(x3,y3)未确定顺序。
此外,如果有翻译单元只有一个类,规则是否仍然适用?
//Z.cpp
int z1 = foo(); // Initialized with (x1,y1) ?
#include "A.hpp"
int z2 = foo(); // Initialized with (x2,y2) or anytime later ?
特别是,包含A:: 是否会创建一个屏障来保证z2 在(x1,y1) 之后被初始化?
结果:
-
g++ 10.1.0:
x1=1 a=2 x2=3 b=4 x3=5 y1=6 y2=7 y3=8 z1=9 z2=10 -
clang++ 10.0.0:
a=1 b=2 x1=3 x2=4 x3=5 y1=6 y2=7 y3=8 z1=9 z2=10
至少对于一组x,y 变量,这两个编译器都打破了我的假设。我错过了什么?
主要是我引用这个
如果 V 和 W 已经有序初始化并且 V 的定义在 W 的定义之前是有序的,或者如果 V 有部分有序的初始化,则 W 没有无序初始化,并且对于 W 的每个定义 E 都存在V 的定义 D 使得 D 在 E 之前按外观排序,则
我读错了这一段吗?我不太确定 ors 和 ands。
【问题讨论】:
-
"是否包含 A:: 会创建一个屏障来保证 z2 在 (x1,y1) 之后初始化?" - 没有。
标签: c++ c++17 language-lawyer