微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RVO 和移动构造函数

如何解决RVO 和移动构造函数

#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();
}

为什么它打印移动而不是复制,因为我正在复制左值?我已经打开了 elide 构造函数标志,它仍然打印移动。是因为 RVO/NRVO 吗?如果是,有人能解释一下 RVO/NRVO 在哪种情况下会发生吗?

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。