【问题标题】:Initialization with empty curly braces用空花括号初始化
【发布时间】:2018-08-15 15:51:54
【问题描述】:

第一次尝试,一切正常:

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 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数,则该对象是默认初始化的;

【问题讨论】:

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


    【解决方案1】:

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

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

    (强调我的)

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

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

    【讨论】:

    • 哦,谢谢。太简单的问题;)那么你能再帮忙吗?当我们分配给已经初始化的变量b_one = {} 会发生什么
    • @GusevSlava operator= 将被尝试调用。如果Base的默认构造函数不是explicit,则{}隐式转换为Base,然后调用复制赋值运算符(Base::operator=(const Base&amp;))。如果默认构造函数是explict,那么它会因为隐式转换失败而失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2017-06-30
    • 1970-01-01
    • 2012-08-04
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多