Код выглядит следующим образом:
template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result)
{
return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}
//A overload version
inline char* copy(const char* first, const char* last, char* result) {
memmove(result, first, last - first);
return result + (last - first);
}
Если я позвоню copy(int*, int*)
, что является лучшим соответствием, будет ли компилятор создавать новую функцию, использующую int*
в качестве параметра шаблона, или int*
будет преобразован в char*
,
А что если я позвоню copy(char[], char[])
обратите внимание, я просто использую char[]
отметить тип параметров.
поскольку int *
неявно конвертируется в char *
ни к const char *
будет вызвана функция шаблона. Удаление функции шаблона приведет к ошибке времени компиляции.
Предложение: очень важно поиграть с компилятором самостоятельно. Вы можете добавить такие строки, как
std::cout << "template function called.\n";
в ваши перегрузки или использовать отладчик для такого рода вещей. Это отличный учебный опыт. Вы также можете просто прочитать некоторые книги по C ++ для ознакомления.
если я вызываю copy (int *, int *), что является лучшим соответствием,
Там только в одном совпадении: шаблон. Версия взяв const char*
не совпадает вообще.
А что если я назову copy (char [], char [])
опять же шаблон выигрывает, потому что аргументы не const
, Если вы сделали это:
const char* c1 = ....;
const char* c2 = ....;
copy(c1, c2);
тогда не шаблон будет победителем, потому что в случае идеального совпадения перегрузки, не шаблонная функция имеет приоритет.