考慮:
template <typename... Args>
void foo(Args... args) {
bar(std::forward<Args>(args)...);
}
template <typename... Args>
void foo2(Args&&... args) {
bar(std::forward<Args>(args)...);
}
我理解在 的情況下完美的右值參考轉發foo2,但是轉發 的可變引數值的目的是什么foo?
如果foo看起來像這樣會有什么不同?
template <typename... Args>
void foo(Args... args) {
bar(args...);
}
uj5u.com熱心網友回復:
這不是一回事。
在這
template <typename... Args>
void foo(Args... args) {
bar(std::forward<Args>(args)...);
}
Args永遠不會被推匯出為參考(foo(Args...)意味著foo通過值而不是參考來獲取引數);- 另一方面
std::forward<T>(t)無非static_cast<T&&>(t)是程式員有更明確的意圖;
這兩件事加起來就是static_cast<Args&&>(args)...有一個右值參考回傳型別,即回傳一個右值(因為Args不是一個參考,所以在Args和之間不會發生參考折疊&&以給出一個左值參考回傳型別,這意味著一個左值回傳值)。
所以不,在您的第一個版本中沒有完美的轉發foo。在std::forward它無條件它的引數轉換到右值; 這通常std::move是作業:
// this is equivalent to the code above
template <typename... Args>
void foo(Args... args) {
bar(std::move(args)...);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/341801.html
