让我们假设一个类:
struct S {
Obj1 o1;
Obj2 o2;
S() : o2( fn2() ), o1( fn1(), fn3() ) {}
};在这种情况下,什么是保证排序的?o1()被排序-在o2()之前。fn1()和fn3()被排序-在o1()之前,fn2()在o2()之前。问题是fns的先后顺序。据我所知,fn1()和fn3()可以按未指定的顺序进行。fn1()和fn3()是否保证在fn2()之前进行排序?
发布于 2018-07-14 00:16:57
[intro.execution]/12一个完整的表达式是. (12.3) -一个init-声明符(第11条)或mem-初始化器(15.6.2),包括初始化器的组成表达式. [intro.execution]/16与完整表达式相关联的每一个值计算和副作用在每个值计算之前进行排序,并在与要评估的下一个完整表达式相关联的副作用之前排序。
因此,对o1( fn1(), fn3() )的调用以及它的所有子表达式和副作用都是在调用o2( fn2() )之前进行排序的。
如果您还不相信,在[class.base.init]/7中有一个非规范的注释
注意:每个mem初始化器执行的初始化构成一个完整表达式(4.6).mem初始化器中的任何表达式都作为执行初始化的完整表达式的一部分进行计算。-end注记
https://stackoverflow.com/questions/51330575
复制相似问题