我有一个结构
struct Data {
int a,b;
Data& operator=(Data &&other) = delete;
};
现在我调用赋值运算符
Data A[2];
A[0] = {1, 2};
调用已删除的函数时出现编译错误。
我的问题是initializer_list如何转换为Data
类型的右值引用?
答案 0 :(得分:3)
我的问题是initializer_list如何转换为数据类型的右值引用?
如果通过 initializer_list 表示类型std::initializer_list
,则示例中没有一个。您正在使用list initialization创建临时Data
实例(prvalue,而不是右值引用)并将其分配给A[0]
,这当然会因为移动而失败赋值运算符已删除。
您的示例与
相同A[0] = Data{1, 2};
答案 1 :(得分:3)
C ++ 17 [expr.ass] / 9:
涵盖了这种语法braced-init-list 可能会出现在
的右侧
- [...]
- 对类类型对象的赋值,在这种情况下,初始化列表作为参数传递给重载决策选择的赋值运算符函数。
给出一个例子:
z = { 1,2 }; // meaning z.operator=({1,2})
将 braced-init-list 作为参数提供给函数的行为意味着函数参数由该列表初始化。在这种情况下,Data&& other
由{1, 2}
初始化。 [dcl.init.list] /3.4:
否则,如果
T
是引用类型,则生成T
引用的类型的prvalue。 prvalue通过copy-list-initialization或direct-list-initialization初始化其结果对象,具体取决于引用的初始化类型。然后使用prvalue直接初始化引用。
因此Data
初始化的{1, 2}
类型的prvalue会成为operator=
参数的初始值设定项。