std::initializer_list 构造函数和 "braced initialization" 问题
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
的构造函数。但是,它不编译:
error: use of deleted function 'C::C()'
-- D d5{{}};
此错误背后的基本原理是什么?
更新
Scott Meyer 的 "Effective Modern C++" 第 55 页上的一个问题让我认为在花括号初始化中使用空花括号会调用带有空列表的 initializer_list
构造函数。那是错的。详见作者this blog post
D d5{{}};
尝试用单元素初始化列表初始化 d5
。该元素是 {}
,它是 C{}
的 shorthand - C
的默认构造实例。但是 C
没有默认构造函数 - 因此出现错误。
考虑以下代码:
#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
的构造函数。但是,它不编译:
error: use of deleted function
'C::C()'
--D d5{{}};
此错误背后的基本原理是什么?
更新
Scott Meyer 的 "Effective Modern C++" 第 55 页上的一个问题让我认为在花括号初始化中使用空花括号会调用带有空列表的 initializer_list
构造函数。那是错的。详见作者this blog post
D d5{{}};
尝试用单元素初始化列表初始化 d5
。该元素是 {}
,它是 C{}
的 shorthand - C
的默认构造实例。但是 C
没有默认构造函数 - 因此出现错误。