Зачем использовать ссылку, чтобы получить * символ? Не лучше ли не использовать ссылки, когда мы используем указатели? - PullRequest
1 голос
/ 04 октября 2019

(у меня будет ряд вопросов в конце). Когда мне нужно создать функцию, которая берет указатель const char* в качестве примера, я никогда не использую ссылку, потому что я думал, что нет смысла использовать ссылку науказатель. Но в книге (C ++ Primer Fifht Edition) автор говорит нам, что нам нужно создать версию функции с именем compare для сравнения нашей строки в стиле c, поэтому мы избегаем использования общей версии шаблона

template <>
int compare(const char* const &p1, const char* const &p2)
{ return strcmp(p1, p2); }

Да, он на самом деле заявляет, что указатели постоянны. И автор на самом деле пишет другую функцию, которая принимает только строковые литералы

template<size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]);

Итак, мои вопросы:

  1. Почему он использует ссылку для получения указателя? Скопировать указатель или получить ссылку одинаково дорого, не правда ли?
  2. Разве первая версия не может принимать строковые литералы?
  3. Почему он использует шаблон для функции, которая неТребуются параметры шаблона? Он пытается перегрузить другую функцию шаблона, но это не разумная причина, не так ли?

1 Ответ

2 голосов
/ 04 октября 2019

Почему он использует ссылку для получения указателя? Скопировать указатель или взять ссылку одинаково дорого, не так ли?

Я предполагаю, что есть шаблон функции:

template <typename T>
int compare(T const &t1, T const &t2) { ... }

, и он используется в другом месте вкодовая база.

Чтобы создать специализацию шаблона для char const*, вам необходимо использовать:

template <>
int compare(char const* const &p1, char const* const &p2) { ... }
 //         <--  T  -->

Не может первая версия принять строковые литералы?

Да, может.

Почему он использует шаблон для функции, которая не требует шаблонных параметров? Он пытается перегрузить другую функцию шаблона, если это не разумная причина, не так ли?

Это синтаксис для специализации шаблона функции. Это может быть перегрузка функции вместо шаблона функции , только если функция вызывается без явного указания параметра шаблона.

Если вы определите

int compare(char const* const &p1, char const* const &p2) { ... }

, она выиграетне вызывается, когда вызывающий абонент использует compare<char const*>(s1, s2).
Он вызывается, когда вызывающий абонент использует compare(s1, s2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...