返回“链接”对象时移动构造函数

时间:2018-10-18 11:05:43

标签: c++

说我有一个仅移动的类,并且该类具有“链接”的方法。例如:

struct C {
    C() = default;
    C(C const&) = delete;
    C(C&&) = default;

    C& chained() {
        return *this;
    }

    int a;
};

C foo(C c) {
    return c.chained();
}

int main()
{
  auto o = foo(C{});
}

在foo的返回语句中出现错误:“使用删除的函数'C :: C(const C&)'”。

为什么要调用副本构造函数?自从它的return语句以来,它不应该使用move构造函数吗?

1 个答案:

答案 0 :(得分:7)

  

为什么要调用副本构造函数?自从它的return语句以来,它不应该使用move构造函数吗?

不。您指的是copy elision(与NRVO有关),并对其有误解。只有当返回的表达式是一个 id-expression (只是一个名称),它引用函数的参数列表中的对象或局部变量时,才会首先尝试移动。

您不返回id表达式,您的表达式是调用成员函数的结果。