Я изучаю шаблоны и особенно 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
;_Ty
и ссылка делятся по вызову на remove_reference
.Как компилятор определяет тип _Ty
?
Шаблон функции должен выяснить параметры шаблона, используя аргументы, переданные функции (если они не определены явно в вызове функции), но вв этом случае remove_reference также является шаблоном класса, который также должен определить тип _Ty
.Для меня это почти как уловка 22, потому что std::forward
должен вычислить _Ty
, используя аргумент функции, но аргумент функции, равный std::remove_reference<_Ty>
, должен уже знать, что такое _Ty
.Все это говорит мне о том, что я плохо понимаю, как работают шаблоны, но я не знаю, где.