是的,這些都是等價的,但慣用的方式是使用普通的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。
實證檢驗:http://melpon.org/wandbox/permlink/mJ0gobWkiplIRGMJ –