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)
当编译它给在功能上的错误WrapperOfGetObj上return Wrapobj.错误是
'Myclass :: Myclass(const Myclass&)':尝试引用已删除的函数
这意味着它正在尝试调用deleted复制构造函数.据我所知Wrapobj是左值,当返回它的行为应该是相同obj的GetObj方法,即,调用移动构造函数在时return.
那么为什么要寻找复制构造函数呢?我在这里错过了什么?
这里的问题是(因为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返回它的时候.我个人建议去寻找第一个选择.