#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?
发布于 2020-12-21 13:19:07
class.copy/32除非源对象是函数参数,并且要复制的对象由左值指定,否则满足或将满足复制操作的省略标准时,首先执行选择复制的构造函数的重载解析,就好像对象是由右值指定的一样。如果重载解析失败,或者如果所选构造函数的第一个参数的类型不是对对象类型的右值引用(可能是cv限定的),则会再次执行重载解析,并将对象视为左值。
此子句允许在return语句中将局部变量或函数参数视为右值,并从其移动构造返回值。
https://stackoverflow.com/questions/65387572
复制相似问题