从函数返回时的右值引用行为

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 相同,即 在 [=12] 时调用移动构造函数=]那为什么要找拷贝构造函数?我在这里错过了什么?

这里的问题是(如 T.C. 在评论部分总结)Wrapobj 是一个引用,而不是一个对象,因此隐式移动——即将返回的左值视为右值- 不适用于这种情况(参见 [class.copy]/32)。

您可以通过以下方式解决此问题:

Myclass Wrapobj = GetObj();

代替当前:

Myclass&& Wrapobj = GetObj();

或在返回时显式 std::move()ing Wrapobj。我个人建议选择第一个选项。