从函数

时间:2016-10-14 07:49:00

标签: c++ c++11 c++14 rvalue-reference

在下面的代码中:

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;
}

编译时,它会在WrapperOfGetObj return上的函数Wrapobj中出错。错误是

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

这意味着它正在尝试调用deleted复制构造函数。我知道Wrapobj是左值,当它被返回时,它的行为应该与obj方法中的GetObj相同,即return时调用移动构造函数那为什么要寻找复制构造函数?我在这里缺少什么?

1 个答案:

答案 0 :(得分:6)

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

您可以通过编写:

来解决此问题
Myclass Wrapobj = GetObj();

而不是当前:

Myclass&& Wrapobj = GetObj();

或者在返回时明确std::move() Wrapobj。我个人建议选择第一个选项。