[英]Should a constructor for a class that contains a move-only type receive the move-only type by reference or by rvalue reference?
[英]returning a move-only rvalue reference
在以下代码中:
#include <memory>
struct C {
C() = default;
C(C const&) = delete;
C(C&&) = default;
int a;
};
C foo(C&& c) {
return c;
}
int main()
{
auto c = foo(C{});
}
我在foo
的return语句中出错:
Use of deleted function 'C::C(const C&)'".
为什么要尝试调用复制构造函数? 不应该使用移动构造函数,因为c
是右值引用? 即使不是因为这个原因,不应该return
语句总是调用移动构造函数,因为return
后值不能继续使用?
内部函数foo
, c
,一个命名的东西,是一个左值。 要调用移动构造函数,您需要明确地使其看起来像一个右值
return std::move(c);
正如juanchopanza所指出的, c
是一个左值(因为它有一个名字)所以它会尝试复制它。 虽然您可以利用事实,但是通过值传递的本地对象和函数参数可以被视为return语句中的rvalues,而不必在return语句中调用std::move
。 这让你可以重写这个功能
C foo(C c) {
return c;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.