首页 > 解决方案 > 返回“链式”对象时移动构造函数

问题描述

假设我有一个只能移动的类,并且该类具有“链接”的方法。例子:

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&)'”。

为什么要尝试调用复制构造函数?既然它是一个返回语句,它不应该使用移动构造函数吗?

标签: c++

解决方案


为什么要尝试调用复制构造函数?既然它是一个返回语句,它不应该使用移动构造函数吗?

不,您指的是并误解了复制省略(与 NRVO 相关)。只有当返回的表达式是一个引用函数参数列表或本地对象的id 表达式(只是一个名称)时,才会首先尝试移动。

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


推荐阅读