所以我在这里读到:https ://stackoverflow.com/a/598150/2642059这是非法的:
foo(i++, i++);
但我相信这是因为没有强制序列,我理解初始化列表就是这种情况。那么这是法律法规吗?
const int foo[] = { i++, i++ };
所以我在这里读到:https ://stackoverflow.com/a/598150/2642059这是非法的:
foo(i++, i++);
但我相信这是因为没有强制序列,我理解初始化列表就是这种情况。那么这是法律法规吗?
const int foo[] = { i++, i++ };
是的,初始化子句的评估顺序在花括号初始化列表中得到保证。
根据标准,§11.6.4/4 列表初始化 [dcl.init.list]:
(强调我的)
在一个花括号初始化列表的初始化列表中,初始化子句,包括任何由包扩展产生的子句,都按照它们出现的顺序进行评估。也就是说,与给定初始化子句相关联的 每个值计算和副作用都在初始化器列表的逗号分隔列表中与任何初始化子句相关联的每个值计算和副作用之前进行排序。[注意:无论初始化的语义如何,这种评估顺序都成立;例如,它适用于初始化器列表的元素被解释为构造函数调用的参数时,即使调用的参数通常没有顺序约束。——尾注]
标准注释的示例,
struct A { A(int, int) {} };
...
int i = 0;
A a1(i++, i++); // used as the arguments of the constructor; unsequenced
A a2{i++, i++}; // used as the arguments of the constructor; sequenced, within the initializer-list of a braced-init-list