C++ c+中带有初始值设定项的结构赋值+;

C++ c+中带有初始值设定项的结构赋值+;,c++,c++11,struct,initializer-list,C++,C++11,Struct,Initializer List,我有一个结构 struct Data { int a,b; Data& operator=(Data &&other) = delete; }; 现在当我调用赋值操作符时 Data A[2]; A[0] = {1, 2}; 调用已删除函数时出现编译错误。 我的问题是如何将初始值设定项列表转换为类型为Data的右值引用 我的问题是初始值设定项列表如何转换为数据类型的右值引用 如果您所说的初始值设定项列表是指类型std::initializer\u list,

我有一个结构

struct Data {
   int a,b;
   Data& operator=(Data &&other) = delete;
};
现在当我调用赋值操作符时

Data A[2];
A[0] = {1, 2};
调用已删除函数时出现编译错误。 我的问题是如何将初始值设定项列表转换为类型为
Data
的右值引用

我的问题是初始值设定项列表如何转换为数据类型的右值引用

如果您所说的初始值设定项列表是指类型
std::initializer\u list
,那么在您的示例中没有。您正在使用创建一个临时
数据
实例(a,不是右值引用)并将其分配给
a[0]
,这当然会失败,因为删除了移动分配操作符

你的例子和我的一样

A[0] = Data{1, 2};

此语法包含在C++17[expr.ass]/9中:

括号内的init列表可能会出现在

  • [……]
  • 对类类型对象的赋值,在这种情况下,初始值设定项列表作为参数传递给重载解析选择的赋值运算符函数
举一个例子:

将带括号的init list作为参数提供给函数的行为意味着函数参数由该列表初始化。在这种情况下,
数据和其他
{1,2}
初始化。[dcl.init.list]/3.4中包括了这一点:

否则,如果
T
是引用类型,则生成由
T
引用的类型的PR值。prvalue通过复制列表初始化或直接列表初始化来初始化其结果对象,具体取决于引用的初始化类型。然后使用prvalue直接初始化引用


因此,有一个类型为
Data
的prvalue,由
{1,2}
初始化,它成为
操作符=

参数的初始值设定项。您的问题与编译错误无关。那么你真正的问题是什么?@VivekKumar这是初始化,而不是赋值运算符。
z = { 1,2 }; // meaning z.operator=({1,2})