std :: initializer_list构造函数和“初始化初始化”问题

时间:2019-01-06 21:19:13

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

考虑以下代码:

#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的{​​{1}}构造函数。并且,由于列表为空,因此不会调用D的构造函数。但是,它不会编译:

  

错误:使用已删除的功能C-'C::C()'

此错误背后的原因是什么?

更新

Scott Meyer的“ Effective Modern C ++”中第55页的问题使我认为,在括号初始化中使用空括号会调用D d5{{}};构造函数,并带有一个空列表。那是错的。有关详细信息,请参见作者的this blog post

1 个答案:

答案 0 :(得分:4)

D d5{{}};尝试使用一个元素初始化器列表初始化d5。一个元素是{},它是C{}的简写-C的默认构造实例。但是C没有默认的构造函数-因此会出现错误。