7

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

class MyClass
{
private
  int test = 0;
}

如果我还像这样在构造函数中初始化变量:

class MyClass
{
private
  int test = 0;

public:
  MyClass() : test(1)
  {
  }
}

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

4

1 回答 1

14

该标准实际上对此有一个规则,在 §12.6.2/9 中:

如果给定的非静态数据成员同时具有大括号或等式初始化器和内存初始化器,则执行内存初始化器指定的初始化,并且非静态数据成员的大括号或等式初始化器是忽略。[示例:给定

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

A(int) 构造函数将简单地将 i 初始化为 arg 的值,并且 i 的大括号或等于初始化器中的副作用不会发生。—结束示例]

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

于 2013-11-09T14:59:18.073 回答