是否有必要在构造函数初始化列表中调用默认ctor?

时间:2016-10-28 15:04:23

标签: c++ c++11 initializer-list

例如,如果我有以下内容:

class Foo;  // has default ctor

class Bar {
 public:
  Bar(Foo* f);
}

class MyClass {
 public:
  MyClass();

 private:
  Foo foo_;
  Bar bar_;
}

MyClass::MyClass() : foo_(), bar_(&foo) {}

这或多或少编译没有警告,请参阅https://godbolt.org/g/yx464A [略有修改,以便Foo充实]。

它在初始化列表中没有foo_()的情况下编译也很好。但有没有人需要调用默认的ctor?

1 个答案:

答案 0 :(得分:4)

好吧,foo_将默认初始化:

  

[C++11: 12.6.2/8]: 在非委托构造函数中,如果 mem-initializer-id <未指定给定的非静态数据成员或基类 / em> (包括没有 mem-initializer-list 的情况,因为构造函数没有 ctor-initializer )且实体不是虚拟的抽象类的基类(10.4),然后是

     
      
  • 如果实体是具有大括号或等于初始值的非静态数据成员,则按照8.5中的规定初始化该实体;
  •   
  • 否则,如果实体是变体成员(9.5),则不执行初始化;
  •   
  • 否则,该实体已默认初始化(8.5)。
  •   

这是否是你想要的取决于你。对于POD,默认初始化(不会对POD成员做任何事情)可能还不够。对于具有非POD成员初始化的实际默认构造函数的类,初始化将按照您的预期进行级联。