从函数返回时的Rvalue引用行为
Rvalue reference behavior while returning from a function
在下面的代码中:
class Myclass
{
public:
Myclass() = default;
~Myclass() = default;
Myclass(Myclass&&) = default;
Myclass& operator=(Myclass&&) = default;
Myclass(const Myclass&) = delete;
Myclass& operator=(const Myclass&) = delete;
};
Myclass GetObj()
{
Myclass obj;
return obj;
}
Myclass WrapperOfGetObj()
{
Myclass&& Wrapobj = GetObj();
return Wrapobj;
}
int main()
{
return 0;
}
当它被编译时,它在return
Wrapobj
上的函数WrapperOfGetObj
中给出错误。错误为
'Myclass::Myclass(const Myclass&(':试图引用已删除的函数
这意味着它正在尝试调用deleted
复制构造函数。正如我所知,Wrapobj
是左值,当它被返回时,它的行为应该与GetObj
方法中的obj
相同,即在return
时调用移动构造函数。那么它为什么要寻找复制构造函数?我在这里错过了什么?
这里的问题是(正如T.C.在评论部分所述(Wrapobj
是一个引用,而不是对象,因此隐式移动(即将返回的左值视为右值(在这种情况下不适用(请参见[class.copy]/32(
你可以通过写以下内容来解决这个问题:
Myclass Wrapobj = GetObj();
代替当前:
Myclass&& Wrapobj = GetObj();
或者在返回时明确std::move()
或Wrapobj
。我个人建议选择第一个选项。
相关文章:
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 警告:返回对临时 - 奇怪情况的引用(对 Rvalue 的澄清)
- 为什么不将RVALUE引用定义为RVALUE表达
- 为什么不能使用 rvalue 来初始化 lvalue 引用
- 对匿名RVALUE的引用被损坏
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 为什么const/nonconst lvalue引用与rvalue参考结合
- rvalue引用lVALUE参考-UB
- 返回const lvalue引用rvalue临时?为什么这项工作
- rvalue 引用和模板参数
- 在Visual Studio 2013中为rvalue引用初始化捕获
- C 禁止将铸件引用到RVALUE参考
- std :: async使用绑定到lambda的rvalue引用
- rvalue引用没有std ::移动
- 对boost asio完成处理程序的rvalue引用
- 将 rvalue/temp 对象传递给需要非成本引用的函数的任何方法
- 悬空 引用 rvalue
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- C++从具有正式参数"rvalue"引用和断言"prvalue"的函数返回"prvalue"?