initializer_list c ++ 11中的评估顺序

lin*_*nus 9 c++ c++11

在下面的代码中是否需要f1在之前调用f2(反之亦然)或者是否未指定?

int f1();
int f2();

std::initializer_list<int> list { f1(), f2() };
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 10

这是C++标准中一个有趣的角落,其中执行顺序定义明确.第8.5.4节[dcl.init.list],第4段:

在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.

因此,在初始化列表中,函数调用从左到右进行计算.