是这个功能吗
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
哪里?
是的,它们是等效的,但是惯用的方法是使用plain 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&& |
如您所见,这完全不依赖于template参数的引用性。
参考折叠在这里更深入地说明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句