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&)'”。
为什么要尝试调用复制构造函数?既然它是一个返回语句,它不应该使用移动构造函数吗?
解决方案
为什么要尝试调用复制构造函数?既然它是一个返回语句,它不应该使用移动构造函数吗?
不,您指的是并误解了复制省略(与 NRVO 相关)。只有当返回的表达式是一个引用函数参数列表或本地对象的id 表达式(只是一个名称)时,才会首先尝试移动。
您不返回 id 表达式,您的表达式是调用成员函数的结果。