Я начал изучать C ++, и в настоящее время я пытаюсь начать работу с шаблонами, поэтому, пожалуйста, потерпите меня, если моя формулировка не на 100% точна.
Я пользуюсь следующей литературой:
- Шаблоны C ++: Полное руководство (2-е издание)
- Эффективный современный C ++: 42 специальных способа улучшить использование C ++ 11 и C ++ 14
В первой книге рассматривается следующая функция шаблона
template<typename T1, typename T2>
auto max(T1 a, T2 b) -> decltype(b<a?a:b) {
return b < a ? a : b;
}
и утверждает, что это определение имеет недостаток, поскольку T1
или T2
может быть ссылкой, так что возвращаемый тип может быть ссылочным типом.
Однако во второй книге говорится, что, если ParamType
, в нашем случае T1
и T2
не является ни указателем, ни ссылкой, что верно для нашего случая, ссылочной частью вызывающего выражения игнорируется.
Проиллюстрировано на примере
template<typename T>
void f(T param);
int x = 27; // as before
const int cx = x; // as before
const int& rx = x; // as before
f(x); // T's and param's types are both int
f(cx); // T's and param's types are again both int
f(rx); // T's and param's types are still both int
Теперь мне интересно, как это вообще возможно, что тип возврата первого фрагмента кода является ссылочным типом?