假设我有这门课:
struct A
{
A(int, int, int) {}
};
我这样初始化它:
A{ a(), b(), c() };
功能在哪里a()
, b()
and c()
全部返回int
。应该a()
之前被调用b()
and b()
before c()
?
我对标准中的以下段落感到困惑(8.5.4 [dcl.init.list] p4):
在花括号初始化列表的初始化列表中,初始化子句,包括任何由 pack 产生的子句
扩展(14.5.3)按照它们出现的顺序进行评估。也就是说,每个值的计算和
与给定的初始化子句相关的副作用在每个值计算和侧面之前排序
与初始值设定项列表的逗号分隔列表中跟随它的任何初始值设定项子句关联的效果。
[ 注意:无论初始化的语义如何,此评估顺序都成立;例如,它适用于
当初始化列表的元素被解释为构造函数调用的参数时,即使
通常,调用的参数没有顺序限制。 ——尾注]
根据引用,这些函数将按照它们出现的顺序被调用,但是当我用我的编译器(g++-4.8.1)测试它时,它不成立。我是否误解了什么?
这是一个海湾合作委员会的错误 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51253(谢谢Casey https://stackoverflow.com/questions/17381573/order-of-evaluation-of-arguments-to-a-constructor/17381687?noredirect=1#comment25231543_17381687用于链接)。您引用的段落一般适用于列表初始化,其中术语在第 8.5.4/1 段中定义得非常清楚:
列表初始化是对象或引用的初始化大括号初始化列表。这样的初始化器是
称为初始化列表,以及逗号分隔的初始化子句列表中的被称为elements的
初始化列表。
没有理由相信这应该只适用于初始化列表构造函数的调用。此外,您引用的段落中的注释澄清了:
本次评价排序无论初始化的语义如何,都成立;例如,它当初始化列表的元素被解释为构造函数调用的参数时适用,尽管通常调用的参数没有顺序限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)