空花括号初始化

时间:2018-08-15 15:51:54

标签: c++ c++11 constructor initialization explicit

第一次尝试,一切正常:

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

从列表初始化:

  

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

通过值初始化:

  

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

1 个答案:

答案 0 :(得分:6)

  

我已经读过cppreference,在两种情况下都将使用默认初始化,并且没有差异。

不,他们不一样。确切地说,Base b{};direct-list-initialization,而Base b_one = {};copy-list-initialization;对于复制列表初始化,只能调用非explicit构造函数。

(重点是我的)

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

  •   
  • 复制列表初始化(显式和非显式构造函数   被考虑,但是仅非显式构造函数可以被称为

  •