例如,如果我有以下内容:
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?
答案 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成员初始化的实际默认构造函数的类,初始化将按照您的预期进行级联。