C++ 在返回“时移动构造函数”;“链锁”;对象
假设我有一个只移动的类,这个类有一个“链”的方法。例如:C++ 在返回“时移动构造函数”;“链锁”;对象,c++,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 =
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的return语句中得到一个错误:“使用已删除的函数'C::C(const C&')”
为什么要尝试调用复制构造函数?它不应该使用move构造函数,因为它是一个return语句吗
为什么要尝试调用复制构造函数?它不应该使用move构造函数,因为它是一个return语句吗
不。你指的是,并且误解了(关于NRVO)。只有当返回的表达式是引用函数参数列表中的对象或本地对象的id表达式(只是名称)时,才会首先尝试移动
您不返回id表达式,您的表达式是调用成员函数的结果 那么,我可以将返回值包装在
std::move()
中吗?或者我是在强迫编译器接受它试图保护我的东西吗?@baruch-这不是为了保护你,而是为了在应用可能破坏的优化时保持保守。如果知道引用是指向可以从中移动的对象,则可以显式应用移动。编译器不会自己做这件事。