Я пытаюсь понять вывод типов, просматривая «Эффективный современный C++» Скотта Мейера.
Рассмотрим фрагмент кода ниже:
template<typename T>
void f(const T& param); // param is now a ref-to-const; paramType is const T&
int x = 27; // as before
const int cx = x; // as before
const int& rx = x; // as before
f(x); // T is int, param's type is const int&
f(cx); // T is int, param's type is const int&
f(rx); // T is int, param's type is const int&
Он говорит, что, поскольку paramType
является ссылкой, мы можем выполнить двухэтапную процедуру, чтобы вывести тип T
:
- Игнорировать ссылки (если есть) в
expr
(т. е.x
,cx
иrx
) - Шаблон соответствует типу
expr
иparamType
Теперь, когда cx
является const int
:
cx -> const целое
paramType -> ссылка на const int
Итак, согласно упомянутой логике, не должно ли T
быть const int
из-за сопоставления с образцом (а не только int
)? Я понимаю, что const
ness cx
был передан paramType
, но то, что он говорит, неверно? Является ли эта двухэтапная процедура, о которой он упомянул, несоблюдением эмпирического правила? Как ты это делаешь?
Спасибо!
paramType
? - person Kerrek SB   schedule 28.03.2017const T&
. Я включил это в комментарии (во 2-й строке кода). - person   schedule 28.03.2017param
. - person Kerrek SB   schedule 28.03.2017const T&
какconst
ссылку наT
вместо ссылки наconst T
; сущностьconst
может связываться только со ссылкойconst
, но сущности без cv могут связываться как со ссылкамиconst
, так и со ссылками неconst
. - person Justin Time - Reinstate Monica   schedule 28.03.2017const
наint
фактически рассматриваетint
какconst
, независимо от того, так это или нет), но не всегда (например, при работе со ссылками на указатели;const int*&
— это не-cv ссылка наconst int*
, аint* const&
— этоconst
ссылка наint*
, что идентично синтаксису разница между указателем наconst int
(const int*
) и указателемconst
наint
(int* const
)). - person Justin Time - Reinstate Monica   schedule 28.03.2017