支持或相等的初始化程序和初始化列表之间的C ++评估顺序?

时间:2013-11-30 17:42:52

标签: c++ c++11 initialization operator-precedence

我有这个结构,

struct
AAA
{
    AAA() : bbb(2)
    {
        // ccc ???
    }

    int bbb = 1;
    int ccc = bbb;
};

AFAIK,如果有初始化列表:bbb(2),则忽略表达式bbb = 1。然后,对我来说,ccc最终会成为什么样的模糊不清。

首先评估 initialization-list 大括号还是相等的初始化程序中的哪一个?它们之间的规则是什么?

2 个答案:

答案 0 :(得分:12)

C++11 draft§12.6.2.9说;

  

如果给定的非静态数据成员同时具有   brace-or-equal-initializer和mem-initializer,初始化   由mem-initializer指定执行,并且是非静态的   数据成员的brace-or-equal-initializer被忽略。

     

[例如:给定

struct A {
  int i = /∗ some integer expression with side effects ∗/ ; 
  A(int arg) : i(arg) { }
  // ...
};
  

A(int)构造函数只需将i初始化为arg的值,   并且i的支撑或等于初始化器的副作用将不会   地点。 - 结束例子]

由于初始化是在声明顺序(第12.6.2.10节)中完成的,并且添加了此规则,因此bbbccc的值都将为2。

答案 1 :(得分:11)

规则始终是始终按声明的顺序初始化,而C ++ 11并没有改变它。这意味着bbb的初始化程序首先运行,然后ccc的初始化程序运行。无论是在字段上指定初始化程序还是作为构造函数的一部分,都无关紧要。