返回仅移动的右值引用

时间:2018-10-17 21:21:42

标签: c++

在以下代码中:

#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之后不能再使用该值了吗?

2 个答案:

答案 0 :(得分:6)

内部函数fooc是一个命名值,是一个左值。要调用move构造函数,您需要显式使其看起来像一个右值

return std::move(c);

答案 1 :(得分:3)

juanchopanza指出,c是一个左值(因为它有一个名称),因此它将尝试复制该值。尽管您可以利用以下事实,而不必在return语句中调用std::move,但可以利用以下事实:通过值传递的本地对象和函数参数可以在return语句中视为右值。这样您就可以像这样重写函数

C foo(C c) {
    return c;
}