考虑以下代码:
#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。
答案 0 :(得分:4)
D d5{{}};
尝试使用一个元素初始化器列表初始化d5
。一个元素是{}
,它是C{}
的简写-C
的默认构造实例。但是C
没有默认的构造函数-因此会出现错误。