This question already has answers here:
Is it defined behavior to reference an early member from a later member expression during aggregate initialization?
(4 个回答)
5年前关闭。
根据标准,在上面的示例中读取“s.a”是否安全,以便将s初始化为a=5和b=6?如果是这样,大多数编译器是否遵守此规则?
(以上在 VC10 中编译。)
(4 个回答)
5年前关闭。
struct
{
int a,b;
} s = {5, s.a+1};
根据标准,在上面的示例中读取“s.a”是否安全,以便将s初始化为a=5和b=6?如果是这样,大多数编译器是否遵守此规则?
(以上在 VC10 中编译。)
最佳答案
是的,因为聚合成员初始化是有序的。
[dcl.init.aggr] /2 有:
[dcl.init.list] /4 有:
聚合成员的复制初始化当然是一个副作用( [intro.execution] /12),并且必须与相应的初始化子句“关联”,因为这是它的完整表达式(因为初始化器- list 不是表达式)。
我尝试过的每个最新编译器(MSVC、Clang、g++)都能正确编译。一些较旧的编译器可能会出错(较旧版本的 g++ 以错误的聚合初始值设定项的顺序而闻名)。
关于c++ - 在聚合初始化列表中的给定位置,传递到先前位置的值是否可以安全地从相应成员中读取?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41847440/