Мой вопрос соответствует шаблону 1,2,3, и я могу полностью понять, почему T становится таким, каким он выглядит. В то время как T в 4-м коде не является символом *, который я предположил.
Потому что вы были введены в заблуждение, узнав неправильный шаблон.Это пример того, почему «ведущий const вводит в заблуждение».Шаблоны не похожи на макросы, и расположение const
слева не означает, что оно применимо к char
.Это относится ко всему типу параметра, и поскольку параметр будет указателем (из-за литералов, передаваемых в качестве аргументов), синтезированная функция будет выглядеть примерно так:
void compare(char const* const, char const* const) {}
Вот почему многие программисты на C ++ (включая меня) предпочитают другое размещение cv-квалификаторов.Где ваши варианты 3 и 4 были бы написаны так:
void compare(T const *, T const *) {}
// T is char
// 4:
void compare(T const, T const ) {}
// T is const char *
Это более последовательно, потому что const
всегда применяется к тому, что слева от него (если есть что-то, в противном случае есть исключение,и запутанное исключение).И это также делает совершенно ясным (ну, в любом случае, IMO), что будет константой, когда вычет закончится.