C++:如何通过初始化列表完成构造?

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.或者它同时提供?

son*_*yao 5

但它怎么能提供一个初始化列表?

不,它不会.

请注意,对于列表初始化 B b1{ 42,"foo" };,执行聚合初始化.

如果T是聚合类型,则执行聚合初始化.

而且B 一个聚合类型,

聚合是以下类型之一:

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
Run Code Online (Sandbox Code Playgroud)

这就是为什么B b1{ 42,"foo" };效果很好的原因.

如果提供用户定义的构造函数,则B变为非聚合类型,则聚合初始化将不再起作用.在这种情况下,您只能初始化Blike B b1{42};B b2(42);,它将调用相应的构造函数.

BTW:在提供用户定义的构造函数(获取一个参数)之后,编译器将不会再次声明隐式声明的默认构造函数.它意味着B b2;B b2{};不会再次起作用.

BTW2:B b2();可能是一个函数声明.看到最烦恼的解析.