第一次尝试,一切正常:
class Base {
public:
Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};
另一种实现方式(添加explicit
):
class Base {
public:
explicit Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {}; // error! Why?
我在cppreference上看到,在这两种情况下,都将使用默认初始化,并且没有区别。
从列表初始化:
否则,如果花括号初始化列表为空,而T是具有默认构造函数的类类型,则执行值初始化。
从值初始化:
如果T是没有默认构造函数或具有用户提供或已删除的默认构造函数的类类型,则对象被默认初始化;
b_one = {}
赋值时会发生什么? - Gusev SlavaBase
的默认构造函数不是explicit
,则会尝试调用operator=
。此时{}
会被隐式转换为Base
,然后调用拷贝赋值运算符 (Base::operator=(const Base&)
)。如果默认构造函数是explicit
,则会失败,因为隐式转换失败。 - songyuanyao