用空花括号初始化

Gus*_*ava 4 c++ constructor initialization explicit c++11

第一次尝试,一切正常:

class Base {
 public:
    Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};
Run Code Online (Sandbox Code Playgroud)

另一种实现方式(添加explicit):

class Base {
 public:
    explicit Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};  // error! Why?
Run Code Online (Sandbox Code Playgroud)

我已经读过cppreference,在这两种情况下都会使用默认初始化而不会出现diffences.

从列表初始化:

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

从值初始化:

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

son*_*yao 7

我已经读过cppreference,在这两种情况下都会使用默认初始化而不会出现diffences.

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

(强调我的)

  • direct-list-initialization(考虑显式和非显式构造函数)

  • copy-list-initialization(考虑显式和非显式构造函数,但只能调用非显式构造函数)

  • @GusevSlava`operator =`将被尝试调用.如果`Base`的默认构造函数不是`explicit`,则`{}`被隐式转换为`Base`,然后调用复制赋值运算符(`Base :: operator =(const Base&)`).如果默认构造函数是`explict`,那么它将失败,因为隐式转换失败. (3认同)