繁体   English   中英

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

[英]struct assignment with initializer_list in c++

我有一个结构

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

现在,当我调用赋值运算符时

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

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

我的问题是initializer_list如何转换为数据类型的右值引用?

如果通过initializer_list表示类型为std::initializer_list ,则示例中没有一个。 您正在使用列表初始化来创建临时Data实例( prvalue ,而不是右值引用)并将其分配给A[0] ,这当然会因删除移动赋值运算符而失败。

你的例子与之相同

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

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来直接初始化参考。

因此,有一个由{1, 2}初始化的Data类型的prvalue,它成为operator=参数的初始化器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM