Учебник по С ++ (5-е изд.): «16.3 Перегрузка и шаблоны» неправильны во всех «более специализированных» примерах?
Раздел 16.3 Учебника по C ++ (5-е издание) - Перегрузка и шаблоны - описывает процедуру сопоставления функций при наличии возможных экземпляров шаблонов функций.
Вот объявление для шаблонов функций, используемых в этом разделе:
using std::string;
template <class T> string debug_rep(const T &); /* 1 */
template <class T> string debug_rep(T *); /* 2 */
// definitions not relevant for the questions
Первый примерstring s("SO");
debug_rep(&s);
затем говорят, что сгенерированные экземпляры будут, таким образом:
debug_rep(const string *&)
(сT
связан сstring *
)debug_rep(string *)
Q1 Это правильно для № 1? Не следует ли это создаватьdebug_rep(string* const &)
вместо?
const string *sp = &s;
debug_rep(sp); //string literal type is const char[10]
затем говорят, что сгенерированные экземпляры будут, таким образом:
debug_rep(const string *&)
(сT
связан сconst string *
)debug_rep(const string *)
Таким образом, оба экземпляра-кандидата предоставят точное совпадение, выбор будет сделан на более специализированном шаблоне (-> # 2)
В2.1 Это правильно для № 1? Не следует ли это создаватьdebug_rep(const string* const &)
?
В2.2 Предполагая, что созданная функция - та, что выше, можем ли мы подтвердить, что она больше не является точным соответствием?
Третий примерdebug_rep("SO world!"); //string literal type is const char[10]
затем говорят, что сгенерированные экземпляры будут, таким образом:
debug_rep(const T &)
(сT
связан сchar[10]
)debug_rep(const string *)
Таким образом, оба экземпляра-кандидата предоставят точное совпадение, выбор будет сделан на более специализированном шаблоне (-> # 2)
В3.1 Тип выводится дляT
правильно в # 1? Не должно ли это бытьconst char[10]
вместо?
В3.2 Предполагая, что выведенный тип дляT
на самом деле тот, что только что приведен выше, можем ли мы подтвердить, что это уже не точное совпадение?