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