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

Eon*_*nil 7 c++ initialization operator-precedence c++11

我有这个结构的地方,

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

    int bbb = 1;
    int ccc = bbb;
};
Run Code Online (Sandbox Code Playgroud)

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

首先评估初始化列表括号或相等初始化程序中的哪一个?它们之间的规则是什么?

Joa*_*son 12

C++ 11草案 §12.6.2.9说;

如果给定的非静态数据成员同时具有大括号或等号初始化器和mem-initializer,则执行mem-initializer指定的初始化,并且非静态数据成员的大括号或等于初始值为忽略.

[例子:给定

struct A {
  int i = /? some integer expression with side effects ?/ ; 
  A(int arg) : i(arg) { }
  // ...
};
Run Code Online (Sandbox Code Playgroud)

A(int)构造函数将简单地将i初始化为arg的值,并且不会发生i的括号或等于初始值设定项中的副作用. - 结束例子]

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


小智 11

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