对构造函数的参数的评估顺序

use*_*108 4 c++ c++11

说我有这个班:

struct A
{
  A(int, int, int) {}
};
Run Code Online (Sandbox Code Playgroud)

我像这样初始化它:

A{ a(), b(), c() };
Run Code Online (Sandbox Code Playgroud)

凡功能a(),b()并且c()所有的回报int.应该a()在之前b()b()之前调用c()吗?

我对标准中的以下段落感到困惑(8.5.4 [dcl.init.list] p4):

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

根据引用,函数将按它们出现的顺序调用,但是当我用我的编译器(g ++ - 4.8.1)测试它时,它没有成功.我误解了什么吗?

And*_*owl 6

这是GCC中的一个错误(感谢Casey的链接).您引用的段落通常适用于列表初始化,其中术语在第8.5.4/1段中非常明确地定义:

列表初始化是从braced-init-list初始化对象或引用.这样的初始化程序称为初始化程序列表,列表的逗号分隔的初始化程序子句称为初始化程序列表的元素.

没有理由相信这应该只适用于初始化列表构造函数的调用.此外,您引用的段落中的注释澄清了:

无论初始化的语义如何,该评估顺序都成立; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束.

  • 这是[GCC bug 51253](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51253). (4认同)