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年前关闭。



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/

10-11 22:46
查看更多