从函数返回时的Rvalue引用行为

Rvalue reference behavior while returning from a function

本文关键字:引用 Rvalue 函数 返回      更新时间:2023-10-16

在下面的代码中:

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。我个人建议选择第一个选项。