c++ - std::initializer_list 构造函数和“支撑初始化”的问题
问题描述
考虑以下代码:
#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
构造函数。D
而且,由于列表为空,因此C
不会调用 的构造函数。但是,它不会编译:
错误:使用已删除的功能
'C::C()'
--D d5{{}};
这个错误背后的原因是什么?
更新
Scott Meyer 的“Effective Modern C++”中第 55 页的一个问题让我认为在大括号初始化中使用空括号会调用initializer_list
带有空列表的构造函数。那是错的。有关详细信息,请参阅作者的这篇博客文章。
解决方案
D d5{{}};
attempts to initialize d5
with a one-element initializer list. That one element is {}
which is a shorthand for C{}
- a default-constructed instance of C
. But C
doesn't have a default constructor - hence the error.
推荐阅读
- android - SMS 内容提供程序光标为空
- knex.js - 重构后 Knex 迁移被破坏
- google-apps-marketplace - 集成按钮导致 404 错误弹出步骤
- javascript - 具有字母和数字范围的 HTML 输入元素密码模式
- regex - 正则表达式:仅在特定行中匹配和替换空格
- angular - 以编程方式访问 Angular 模块结构
- jquery - 我可以将 json 对象从控制器传递到视图而无需视图的任何请求吗?
- javascript - 无法弄清楚如何正确断言对象
- python - max() 或 min() 函数进行多少次比较?
- angular - Ionic 3 中 Fabric 崩溃分析设置的挑战