2016-11-29 64 views
3

::前鋒這個功能相當於使用std與轉發參考

template< typename T > 
void foo(T&& in) 
{ 
    bar(std::forward<T>(in)); 
} 

template< typename T > 
void foo(T&& in) 
{ 
    bar(std::forward<T&&>(in)); 
} 

,其中轉發引用T&&傳遞給std::forward

+3

實證檢驗:http://melpon.org/wandbox/permlink/mJ0gobWkiplIRGMJ –

回答

1

是的,這些都是等價的,但慣用的方式是使用普通的T

這裏是forward函數模板在C++ 14定義瞭如何:

1) 
template< class T > 
constexpr T&& forward(typename std::remove_reference<T>::type& t) noexcept; 
2) 
template< class T > 
constexpr T&& forward(typename std::remove_reference<T>::type&& t) noexcept; 

首先,讓我們來修改你的例子有點使類型減少混亂:

template< typename U > 
void foo(U&& in) 
{ 
    using T = U; // or U&& 
    bar(std::forward<T>(in)); 
} 

現在,我們考慮返回類型forward - T&&,int用作示例:

|  U |  T |    T&& | 
| int | int |   int&& | 
| int& | int& | int& && = int& | 
| int&& | int&& | int&& && = int&& | 

using T = U&&

|  U |  U&& (also T) |    T&& | 
| int |   int&& | int&& && = int&& | 
| int& | int& && = int& | int& && = int& | 
| int&& | int&& && = int&& | int&& && = int&& | 

所以,結果類型是相同的。

至於參數,typename std::remove_reference<T>::type是一個死牌。我使用remove_ref<T>的可讀性:

|  T | remove_ref<T> | remove_ref<T>& | remove_ref<T>&& | 
| int |   int |    int& |   int&& | 
| int& |   int |    int& |   int&& | 
| int&& |   int |    int& |   int&& | 

正如你可以看到,這是不依賴於模板參數的參考岬可言。

參考摺疊更深入的解釋here