[英]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.