在c ++中使用initializer_list进行struct assignment

时间:2018-05-17 00:49:32

标签: c++ c++11 struct initializer-list

我有一个结构

struct Data {
   int a,b;
   Data& operator=(Data &&other) = delete;
};

现在我调用赋值运算符

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

调用已删除的函数时出现编译错误。 我的问题是initializer_list如何转换为Data类型的右值引用?

2 个答案:

答案 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=参数的初始值设定项。