C++ 11是否重新初始化已初始化的成员字段?

Raf*_*fid 7 c++ c++11

C++ 11现在支持在声明时设置类成员字段的值,如下所示:

class MyClass
{
private
  int test = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我也在构造函数中初始化变量,如下所示:

class MyClass
{
private
  int test = 0;

public:
  MyClass() : test(1)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

这会导致变量的值设置两次,还是规范规定编译器应该优化它以仅将变量初始化一次?如果规范没有规定任何内容,您是否知道着名编译器(例如MSVC,GCC等)的行为?

jog*_*pan 14

标准实际上有一个规则,在§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的括号或等于初始值设定项中的副作用. - 结束例子]

因此,在您描述的情况下,如果调用默认构造函数,则仅执行在那里定义的初始化,并且test将执行1.