首页 > 解决方案 > std::initializer_list 构造函数和“支撑初始化”的问题

问题描述

考虑以下代码:

#include <initializer_list>

class C {
public:
    C() = delete;
    C(int) {}
};

class D {
public:
    D(std::initializer_list<C> il) {} 
};

int main()
{
    std::initializer_list<C> il{};  // fine: empty list, no need to construct C
    D d2(il);                       // fine: calls initializer_list ctor with empty list
    D d3{il};                       // ditto
    D d4({});                       // still fine
    D d5{{}};                       // error: use of deleted function 'C::C()' 
                                    // WHY is the constructor of 'C' required here?
}

我以为会用一个空列表D d5{{}};调用initializer_list构造函数。D而且,由于列表为空,因此C不会调用 的构造函数。但是,它不会编译:

错误:使用已删除的功能'C::C()'--D d5{{}};

这个错误背后的原因是什么?

更新

Scott Meyer 的“Effective Modern C++”中第 55 页的一个问题让我认为在大括号初始化中使用空括号会调用initializer_list带有空列表的构造函数。那是错的。有关详细信息,请参阅作者的这篇博客文章

标签: c++c++11c++14initializer-listlist-initialization

解决方案


D d5{{}}; attempts to initialize d5 with a one-element initializer list. That one element is {} which is a shorthand for C{} - a default-constructed instance of C. But C doesn't have a default constructor - hence the error.


推荐阅读