我正在学习模板,尤其是std::forward
;当我检查它的实现时,它在它的参数列表中使用了另一个类模板std::remove_reference
:
template<class _Ty>
_Ty&& forward(typename remove_reference<_Ty>::type& _Arg)
{// forward an lvalue as either an lvalue or an rvalue
// ...
}
顺便说一句:为了清晰起见,我删除了一些东西,比如inline、constexpr、NO_EXCEPT和函数体
我读到了当模板参数是指针(_Ty*
)、引用(_Ty
&)、通用引用(_Ty
)以及类型本身(_Ty
)时,类型是如何推导出来的。在本例中,它是一个引用,但在它前面添加了removed_reference<_Ty>::type
;通过调用remove_reference
将_Ty
和引用分开。编译器如何确定_Ty
的类型
函数模板必须使用传递给函数的参数来确定模板参数(当没有在函数调用中显式定义它们时),但在本例中,remove_reference也是一个需要确定_Ty
类型的类模板。对我来说,这似乎是个难题,因为std::forward
需要使用它的函数参数来找出_Ty
,但是它的函数参数std::remove_reference<_Ty>
需要已经知道_Ty
是什么。所有这些都告诉我,我对模板的工作原理有一个有缺陷的理解,但我不知道在哪里。
发布于 2019-05-30 05:21:14
它不会演绎它。这就是为什么当你使用std::forward
时,你必须给它提供模板参数:
std::forward<T>(t);
这与std::move
相反,它确实是演绎的,通常使用如下方式:
std::move(t);
https://stackoverflow.com/questions/56368603
复制相似问题