4

说我有这门课:

struct A
{
  A(int, int, int) {}
};

我像这样初始化它:

A{ a(), b(), c() };

函数在哪里a()b()全部c()返回int。应该a()叫 beforeb()b()beforec()吗?

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

在花括号初始化列表的初始化列表中,初始化子句,包括由包扩展 (14.5.3) 产生的任何初始化子句,按照它们出现的顺序进行评估。也就是说,与给定初始化子句相关联的每个值计算和副作用在初始化器列表的逗号分隔列表中与任何初始化子句相关联的每个值计算和副作用之前进行排序。[注意:无论初始化的语义如何,这种评估顺序都成立;例如,它适用于初始化器列表的元素被解释为构造函数调用的参数时,即使调用的参数通常没有顺序约束。——尾注]

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

4

2 回答 2

6

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

列表初始化是从一个花括号初始化列表初始化一个对象或引用。这样的初始化器称为初始化器列表,列表中以逗号分隔的初始化器子句称为初始化器列表的元素

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

无论初始化的语义如何,这种评估顺序都成立;例如,当初始化列表的元素被解释为构造函数调用的参数时,它适用,即使调用的参数通常没有顺序约束。

于 2013-06-29T15:17:48.427 回答
2

小心你正在处理的事情。据我所知,您引用的报价仅适用于初始化列表。您使用的功能是统一初始化。它是初始化列表所必需的,但我怀疑它是否用于统一初始化。

于 2013-06-29T15:08:05.853 回答