使用空大括号进行初始化

Initialization with empty curly braces

本文关键字:初始化      更新时间:2023-10-16

第一次尝试,一切正常:

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 上阅读过,在这两种情况下都将使用默认初始化并且没有差异。

从列表初始化:

否则,如果大括号的 init-list 为空,并且 T 是具有默认构造函数的类类型,则执行值初始化。

从值初始化:

如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数,则对象默认初始化;

我在 cppreference 上读到,在这两种情况下都会使用默认初始化并且没有差异。

不,它们不一样。准确地说,Base b{};是直接列表初始化,而Base b_one = {};是复制列表初始化;对于复制列表初始化,只能调用非explicit构造函数。

(强调我的(

  • 直接列表初始化(显式和非显式( 考虑构造函数(

  • 复制列表初始化(显式和非显式构造函数( 被考虑,但只能调用非显式构造函数(