std::initializer_list构造函数和"braced initialization"的问题

Issue with std::initializer_list constructor and "braced initialization"

本文关键字:braced initialization 问题 构造函数 initializer list std      更新时间:2023-10-16

请考虑以下代码:

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

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

此错误背后的理由是什么?

更新

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

D d5{{}};尝试使用单元素初始值设定项列表初始化d5{}该元素是C{}的简写 -C的默认构造实例。但是C没有默认的构造函数 - 因此出现了错误。