[英]Forward or Move
这些是前进和前进的有效用法吗?
f3和f4相同吗?
这样做有危险吗?
谢谢!
#include <utility>
class A {};
A f1() {
A a;
return a; // Move constructor is called
}
A f2(A&& a) {
return a; // Copy constructor is called, which is what I try to avoid.
}
A f3(A&& a) {
return std::forward<A&&>(a); // Move constructor is called
}
A f4(A&& a) {
return std::move(a); // Move constructor is called
}
将std::forward
与通用引用一起使用 ,即template <typename T> ... T&&
。
使用带有右值引用的 std::move
(例如A&&
)。
因此, f1
和f4
都是合理的解决方案。 他们做不同的事情,因此您必须决定要选择哪一个。
不要使用f2
或f3
。
std::forward
之所以存在是因为&&
在类型推导下的工作方式存在怪异。
下型扣, T
在T&&
将结合的3种可能性之一。 如果从左值int&
推导,则T
将绑定到int&
。 那么int& &&
只是int&
。 如果从左值int const&
推导,则T
将绑定到int const&
,并且int const& &&
是int const&
。 如果从某种右值int
推导,则T
将绑定到int
,并且int&&
是int&&
。
std::forward
是一个实用函数,用于反转该映射。 std::forward<>
的三个相关签名为: T& std::forward<T&>(T&)
或T const& std::forward<T const&>(T const&)
或T&& std::forward<T>(T&&)
当进行称为“完美转发”的技术时,所有这些最终都非常有用,在这种技术中,您在类型推导上下文中使用T&&t
,然后std::forward<T>(t)
传递与以前相同的“相同类型”推到另一个电话。
请注意,上面有一些简化之处。 例如, T const&&
的可能性在类型上也相当模糊。 我可能掩盖了类型推导的工作原理的一些细节,术语rvalue
和lvalue
不能完全反映C ++ 11中不同类型变量值的全5倍(或者是6?)。
对于您的示例,它们将执行相同的操作,但是使用std::move
是惯用的
A f(A&& a) {
// use std::move(a)
}
功能模板的情况略有不同
template<typename A>
A f(A&& a) {
// use std::forward<A>(a)
}
不同之处在于,第二个版本可以同时接收左值和右值(Scott Meyers将其命名为“ 通用引用 ”),而第一个版本只能接收右值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.