说我有一个仅移动的类,并且该类具有“链接”的方法。例如:
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构造函数吗?
答案 0 :(得分:7)
为什么要调用副本构造函数?自从它的return语句以来,它不应该使用move构造函数吗?
不。您指的是copy elision(与NRVO有关),并对其有误解。只有当返回的表达式是一个 id-expression (只是一个名称),它引用函数的参数列表中的对象或局部变量时,才会首先尝试移动。
您不返回id表达式,您的表达式是调用成员函数的结果。