在以下代码中:
#include <memory>
struct C {
C() = default;
C(C const&) = delete;
C(C&&) = default;
int a;
};
C foo(C&& c) {
return c;
}
int main()
{
auto c = foo(C{});
}
在foo
的返回语句中出现错误:
Use of deleted function 'C::C(const C&)'".
为什么要调用副本构造函数?因为c
是右值引用,所以不应该使用move构造函数吗?即使不是出于这种原因,return
语句也不应该始终调用move构造函数,因为在return
之后不能再使用该值了吗?
答案 0 :(得分:6)
内部函数foo
,c
是一个命名值,是一个左值。要调用move构造函数,您需要显式使其看起来像一个右值
return std::move(c);
答案 1 :(得分:3)
juanchopanza指出,c
是一个左值(因为它有一个名称),因此它将尝试复制该值。尽管您可以利用以下事实,而不必在return语句中调用std::move
,但可以利用以下事实:通过值传递的本地对象和函数参数可以在return语句中视为右值。这样您就可以像这样重写函数
C foo(C c) {
return c;
}