第一次尝试,一切正常:
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 是没有默认构造函数或具有用户提供或删除的默认构造函数的类类型,则该对象被默认初始化;
我在 cppreference 上读到,在这两种情况下都将使用默认初始化并且没有差异。
不,他们不一样。准确地说,Base b{};
is 直接列表初始化 https://en.cppreference.com/w/cpp/language/list_initialization#direct-list-initialization, while Base b_one = {};
is 复制列表初始化 https://en.cppreference.com/w/cpp/language/list_initialization#copy-list-initialization;对于复制列表初始化,只有非explicit
可以调用构造函数。
(强调我的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)