C++ 在聚合初始化列表中的给定位置,传递到前面位置的值是否可以安全地从相应成员读取?

C++ 在聚合初始化列表中的给定位置,传递到前面位置的值是否可以安全地从相应成员读取?,c++,aggregate-initialization,C++,Aggregate Initialization,根据标准,在上述示例中读取“s.a”是否安全,以便将s初始化为a=5和b=6?如果是这样,大多数编译器都遵守这个规则吗 (以上在VC10中编译。)是,因为聚合成员初始化是按顺序进行的 [dcl.init.aggr]/2具有: 当聚合由初始值设定项列表初始化时,如8.5.4所述,初始值设定项列表的元素 以递增下标或成员顺序作为聚合成员的初始值设定项。每个 成员是从相应的初始值设定项子句复制初始化的 [dcl.init.list]/4具有: 在带括号的init列表的初始值设定项列表中,初始值设定项子

根据标准,在上述示例中读取“s.a”是否安全,以便将s初始化为a=5和b=6?如果是这样,大多数编译器都遵守这个规则吗


(以上在VC10中编译。)

是,因为聚合成员初始化是按顺序进行的

[dcl.init.aggr]/2具有:

当聚合由初始值设定项列表初始化时,如8.5.4所述,初始值设定项列表的元素 以递增下标或成员顺序作为聚合成员的初始值设定项。每个 成员是从相应的初始值设定项子句复制初始化的

[dcl.init.list]/4具有:

在带括号的init列表的初始值设定项列表中,初始值设定项子句,包括由pack生成的任何 扩展(14.5.3)按其出现的顺序进行评估。也就是说,每个值的计算和 与给定初始值设定项子句相关联的副作用在每次值计算和副作用之前排序 与初始值设定项列表的逗号分隔列表中紧跟其后的任何初始值设定项子句关联的效果

聚合成员的复制初始化当然是一个副作用([intro.execution]/12),并且必须与相应的初始值设定项子句“关联”,因为这是它的完整表达式(因为初始值设定项列表不是表达式)


我尝试过的每个最新编译器(MSVC、Clang、g++)都能正确编译这一点。可能是一些较旧的编译器弄错了(众所周知,较旧版本的g++将聚合初始值设定项的顺序弄错了)。

谢谢!只是仔细检查一下--您使用的是最新版本的规范吗?我知道C++11引入了一些有关初始值设定项语法的新行为。@KeithRussell是的,这是C++11(和C++14)。C++03在这方面没有得到充分的说明。
struct
{
    int a,b;
} s = {5, s.a+1};