簡體   English   中英

前進或移動

[英]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&& )。

因此, f1f4都是合理的解決方案。 他們做不同的事情,因此您必須決定要選擇哪一個。

不要使用f2f3

std::forward之所以存在是因為&&在類型推導下的工作方式存在怪異。

下型扣, TT&&將結合的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&&的可能性在類型上也相當模糊。 我可能掩蓋了類型推導的工作原理的一些細節,術語rvaluelvalue不能完全反映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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM