从函数返回时的右值引用行为
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
。我个人建议选择第一个选项。
在下面的代码中:
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
。我个人建议选择第一个选项。