Я изучаю шаблоны C ++, и я застрял, думая о взаимодействии между const и типами, которые являются аргументами функций шаблона.В частности, я думаю о том, как консты взаимодействуют с типами шаблонов при применении вне списка параметров шаблона.
Я пытался искать это взаимодействие в C ++ Primer 5th ed (Lippman) и в стандарте C ++ 11черновик, но const в этом контексте либо явно не упоминается, либо (в случае стандарта) довольно сложен в своем описании (я все еще новичок в C ++).
Вот пример кода моегоПроблема:
template<typename T>
const T & constify(T & t) {
return t;
}
...
int* i = 0x12345678;
constify(i);
У меня есть два разных ожидания типа возвращаемого значения:
- Выведенный тип возвращаемого значения -
const (int *) &
, т.е. const применяется впоследствии, поэтому мы не можемизмените указатель int, но мы можем изменить то, на что он указывает. - Выведенный тип возвращаемого значения -
const int * &
, т.е. все деклараторы и квалификаторы применяются сразу, а не как в 1. Здесь мы больше не можемизмените целое число, на которое указывает целое число, но мы можем изменить и сам указатель.
Для меня первое имеет больше смысла, поскольку оно имеетестественное «подобное замене» правило, стоящее за ним, подобное typedef.Но мой вопрос таков;какой из них (если есть) является правильным и почему?