ath*_*hos 3 c++ constructor initialization language-lawyer list-initialization
C++允许实例化一个类,通过初始化列表设置公共成员的值,如下例所示b1:
class B {
public:
int i;
std::string str;
};
B b1{ 42,"foo" };
B b2();
Run Code Online (Sandbox Code Playgroud)
; 但是,如果我提供构造函数
B(int k) { }
Run Code Online (Sandbox Code Playgroud)
,它不会编译.
那么,引擎盖后面发生了什么?是不是当没有提供构造函数时,编译器会提供一个?但它怎么能提供一个初始化列表?我认为它只会提供一个不带输入的"空白"构造函数,如示例所示b2.或者它同时提供?
但它怎么能提供一个初始化列表?
不,它不会.
请注意,对于列表初始化 B b1{ 42,"foo" };,将执行聚合初始化.
如果
T是聚合类型,则执行聚合初始化.
而且B 是一个聚合类型,
聚合是以下类型之一:
Run Code Online (Sandbox Code Playgroud)array type class type (typically, struct or union), that has no private or protected non-static data members no user-provided, inherited, or explicit constructors (explicitly defaulted or deleted constructors are allowed) no virtual, private, or protected base classes no virtual member functions
这就是为什么B b1{ 42,"foo" };效果很好的原因.
如果提供用户定义的构造函数,则B变为非聚合类型,则聚合初始化将不再起作用.在这种情况下,您只能初始化Blike B b1{42};或B b2(42);,它将调用相应的构造函数.
BTW:在提供用户定义的构造函数(获取一个参数)之后,编译器将不会再次声明隐式声明的默认构造函数.它意味着B b2;或B b2{};不会再次起作用.
BTW2:B b2();可能是一个函数声明.看到最烦恼的解析.