簡體   English   中英

為什么std :: forward在這種情況下無用

[英]Why is std::forward useless in this context

我注意到std::forward在這種情況下沒用:

void consumeObject(std::unique_ptr<Object>&& robj) {
  myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}

這是為什么? 我認為當rvalue引用綁定到一個函數參數時(即我可以通過名稱引用它),它在該范圍內變為左值,並且為了被傳遞,需要被轉換為右值引用(如在完美轉發中) )。

為什么它錯了/沒用?

這是沒有的使用std::forward這里(本身),但它是不恰當的,從而誤導(在這個意義上,可以說,這其實錯誤的)。

你拼寫“將某些內容轉換為對其類型的右值引用”的方式是std::move 這是std::move做的唯一事情 - 它是一個static_cast<T&&> ,你不必拼出T

std::forward是一個不同的野獸,旨在用於完美轉發。 完美轉發僅發生在模板中,其中可以進行轉發引用 轉發引用是一種引用,由於該語言中的特殊規則,它可以推導為左值引用或右值引用。 在那里,你需要std::forward<T>來重新設置適當的值類別(左值或右值)。

玩具示例:

void print(int &)
{
  std::cout << "Lvalue\n";
}

void print(int &&)
{
  std::cout << "Rvalue\n";
}

template <class T>
void perfectForwarder(T &&v)
{
  print(std::forward<T>(v));
}

int main()
{
  int i;
  perfectForwarder(i);
  perfectForwarder(std::move(i));
  perfectForwarder(42);
}

輸出將是:

左值
右值
右值

[生活]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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