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

gau*_*waj 3 c++ rvalue-reference c++11 c++14

在以下代码中:

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;
}
Run Code Online (Sandbox Code Playgroud)

当编译它给在功能上的错误WrapperOfGetObjreturn Wrapobj.错误是

'Myclass :: Myclass(const Myclass&)':尝试引用已删除的函数

这意味着它正在尝试调用deleted复制构造函数.据我所知Wrapobj是左值,当返回它的行为应该是相同objGetObj方法,即,调用移动构造函数在时return. 那么为什么要寻找复制构造函数呢?我在这里错过了什么?

And*_*owl 6

这里的问题是(因为TC在评论部分中包含)Wrapobj是一个引用,而不是一个对象,因此隐式移动 - 即将返回的左值作为右值处理 - 在这种情况下不适用(参见[class.copy]/32).

你可以通过写:

Myclass Wrapobj = GetObj();
Run Code Online (Sandbox Code Playgroud)

而不是当前:

Myclass&& Wrapobj = GetObj();
Run Code Online (Sandbox Code Playgroud)

或通过显式std::move()荷兰国际集团Wrapobj返回它的时候.我个人建议去寻找第一个选择.