在下面的代码中,是否需要在f1
之前调用f2
(反之亦然)或未指定?
int f1();
int f2();
std::initializer_list<int> list { f1(), f2() };
答案 0 :(得分:10)
这是C ++标准中一个有趣的角落,其中执行顺序定义明确。第8.5.4节[dcl.init.list],第4段:
在braced-init-list的initializer-list中,initializer-clause(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估。也就是说,与给定的initializer子句相关联的每个值计算和副作用在每个值计算和副作用之前都会在与初始化列表的逗号分隔列表中的任何initializer子句相关联之前进行排序。
因此,在初始化列表中,函数调用从左到右进行计算。