首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RVO和move构造函数

RVO和move构造函数
EN

Stack Overflow用户
提问于 2020-12-21 12:34:36
回答 1查看 80关注 0票数 0
代码语言:javascript
复制
#include <bits/stdc++.h>

struct Row
{
  int a;
  Row() { puts("default"); }
  Row(const Row &other) { puts("copy"); }
  Row(Row &&other) { puts("move"); }
  Row(int) { puts("conv. c'tor"); }
};

Row return_row()
{

  Row r(6);
  Row second = r;
  return second; // move happens here
}

int main()
{
  Row x = return_row();
}

为什么它打印移动而不是复制,因为我正在复制左值?我已经翻转了椭圆构造函数的旗帜,它仍然打印移动。是因为RVO/ NRVO吗?如果是,谁能解释一下在哪种情况下会发生RVO/NRVO?

EN

回答 1

Stack Overflow用户

发布于 2020-12-21 13:19:07

class.copy/32除非源对象是函数参数,并且要复制的对象由左值指定,否则满足或将满足复制操作的省略标准时,首先执行选择复制的构造函数的重载解析,就好像对象是由右值指定的一样。如果重载解析失败,或者如果所选构造函数的第一个参数的类型不是对对象类型的右值引用(可能是cv限定的),则会再次执行重载解析,并将对象视为左值。

此子句允许在return语句中将局部变量或函数参数视为右值,并从其移动构造返回值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65387572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档