让我们假设一个课程:
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()之前排序?
答案 0 :(得分:2)
[intro.execution]/12 完整表达式是...
(12.3)—一个 init-declarator (第11条)或一个 mem-initializer (15.6.2),包括初始化程序的组成表达式...
[intro.execution]/16在与要评估的下一个完整表达式关联的每个值计算和副作用之前,对与一个完整表达式关联的每个值计算和副作用进行排序。
因此,o1( fn1(), fn3() )
的调用及其所有子表达式和副作用在o2( fn2() )
调用之前被排序。
如果您仍然不确定,[class.base.init]/7中有一个非规范性注释:
[注意:由每个 mem-initializer 执行的初始化构成完整表达式(4.6)。 mem-initializer 中的任何表达式都将作为执行初始化的全表达式的一部分进行评估。 -尾注]