[英]Issue with std::initializer_list constructor and “braced 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{{}};
将使用空列表调用D
的initializer_list
构造函数。 并且,由于列表为空,因此不会调用C
的构造函数。 但是,它不编译:
错误:使用已删除的函数
'C::C()'
-D d5{{}};
这个错误背后的理由是什么?
Scott Meyer的“Effective Modern C ++”中的第55页上的一个问题让我觉得在支撑初始化中使用空括号会调用带有空列表的initializer_list
构造函数。 那是错的。 有关详细信息,请参阅作者的此博客文章 。
D d5{{}};
尝试使用单元素初始化列表初始化d5
。 那个元素是{}
,它是C{}
的简写 - 一个默认构造的C
实例。 但是C
没有默认构造函数 - 因此错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.