执行数组动态初始化时的操作顺序

时间:2011-11-04 23:39:50

标签: c++ initialization

我浏览了dcl.init.aggr部分,找不到明确的答案。

考虑:

static int x[2] = { f(), g() };

标准是否说首先进行初始化:x [0]或x [1]?

换句话说,哪个函数首先运行:f()或g()?

2 个答案:

答案 0 :(得分:6)

以下是标准的一些相关摘录,可以回答您的问题:

8.5.1 / 2“当初始化列表初始化聚合时,如8.5.4中所述,初始化列表的元素被视为聚合成员的初始化者,增加下标或成员顺序。 “

8.5.4 / 4“在braced-init-list的initializer-list中,initializer-clause,包括pack扩展(14.5.3)产生的任何结果,按照它们出现的顺序进行评估。也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和与初始化列表的逗号分隔列表中跟随它的任何初始化子句相关联的副作用之前被排序。 [注意:无论初始化的语义如何,此评估顺序都保持不变;例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束。 - 后注]

答案 1 :(得分:0)

如果我没记错的话,标准没有定义评估的顺序,而是特定于实现。