在C,C++中进行初始化排序

18 c c++ initialization initializer-list

考虑以下初始化:

/* C, C++ */
int a[] = { f(), g() };
struct { int x, y } foo = { f(), g() };

/* C++ */
struct goo { goo(int x, int y);  };

goo b = { f(), g() };
goo c { f(), g() };    /* C++11 */
goo d ( f(), g() );
Run Code Online (Sandbox Code Playgroud)

是执行的顺序f()g()在由C和C++标准中规定的任何行?

Vla*_*cow 20

在所有这两个案例中

goo b = { f(), g() };
goo c { f(), g() };    /* C++11 */
Run Code Online (Sandbox Code Playgroud)

评估顺序从左到右确定,所有副作用应在下一个初始化器之前应用.

来自C++标准

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

但是在C中还有其他规则

初始化列表表达式的评估相对于彼此不确定地排序,因此未指定任何副作用发生的顺序.


hac*_*cks 11

执行顺序f()和g()是否在C和C++标准指定的任何行中?

在C,没有.他们可以按任何顺序进行评估.

C11 6.7.9初始化

初始化列表表达式的评估相对于彼此不确定地排序,因此任何副作用发生的顺序是未指定的,152).

虽然C++ 11说评估的顺序是确定性的.

8.5.4:4列表初始化

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


152)特别是,评估顺序不必与子对象初始化的顺序相同.