考虑以下初始化:
/* 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() );
是执行顺序f()
and g()
在 C 和 C++ 标准指定的任何行中?
在所有这两种情况下
goo b = { f(), g() };
goo c { f(), g() }; /* C++11 */
评估顺序从左到右确定,所有副作用应在下一个初始化器之前应用。
来自 C++ 标准
4 在花括号初始化列表的初始化列表中,
初始化子句,包括任何由包扩展产生的子句
(14.5.3),按照它们出现的顺序进行评估。那是,
与给定相关的每个值计算和副作用
初始化子句在每次值计算之前排序,并且
与它后面的任何初始化子句相关的副作用
初始化列表的逗号分隔列表。
然而在C语言中还有其他规则
初始化列表表达式的计算是
彼此之间的顺序不确定,因此
任何副作用发生的顺序未指定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)