在下面的代码中:
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
时调用移动构造函数。
那为什么要寻找复制构造函数?我在这里缺少什么?
答案 0 :(得分:6)
这里的问题是(因为TC在评论部分中包含)Wrapobj
是一个引用,而不是一个对象,因此隐式移动 - 即将返回的左值视为右值 - 在这种情况下不适用(见[class.copy]/32)。
您可以通过编写:
来解决此问题Myclass Wrapobj = GetObj();
而不是当前:
Myclass&& Wrapobj = GetObj();
或者在返回时明确std::move()
Wrapobj
。我个人建议选择第一个选项。