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