结合使用std :: forward和转发参考

亚伯拉罕·希尔伯特

是这个功能吗

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章