用作成员构造函数参数的函数的求值顺序

Order of evaluation of functions used as parameters to member constructors

本文关键字:函数 顺序 参数 成员 构造函数      更新时间:2023-10-16

让我们假设一个类:

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((之前排序?

[intro.execution]/12 全表达式是…

(12.3(-init声明器(第11条(或mem初始化器[第15.6.2条],包括初始化器的组成表达式。。。

[interro.execution]/16与一个完整表达式相关的每个值计算和副作用都会在与下一个要评估的完整表达式相关联的每个值运算和副作用之前进行排序。

因此,o1( fn1(), fn3() )的调用及其所有子表达式和副作用在o2( fn2() )的调用之前进行排序。

如果你仍然不相信,[class.base.init]/7:中有一个非规范性的注释

[注意:每个mem初始值设定项执行的初始化构成一个完整表达式(4.6(。mem初始值设置项中的任何表达式都将作为执行初始化的完整表达式的一部分进行评估。--end Note]