Re[6]: Haters gonna hate but with proofs
От: rg45 СССР  
Дата: 17.01.19 08:00
Оценка: 2 (1)
Здравствуйте, _vanger_, Вы писали:

__>Ух ты! А почему, когда длины строк равны, они интерпретируются как string, а если различны, как char*?


Строковые литералы имеют тип массивов. А это значит, что литералы разной длины имеют разный тип. Такой вот ускользающий от внимания факт. И фокус в том, что во втором варианте используются неконстантные указатели. Поэтому шаблонный вариант дает лучшее соответствие типов формальных и фактических параметнов, но подходит он только для литералов одинакового типа, то есть, одинаковой длины. Но если мы добавим еще одну перегрузку с константыми указателями, то в обоих случаях будет использоваться только она, как дающая наилучшее соответствие формальных и фактических параметров:

https://ideone.com/CCBEMy

#include <iostream>

template <typename T>
int foo(T&, T&) { return 1; }

int foo(char*, char*) { return 2; }

int foo(const char*, const char*) { return 3; }


int main()
{
   std::cout << foo("Hello", "World") << std::endl;
   std::cout << foo("Hello", "World!") << std::endl;
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 17.01.2019 9:40 rg45 . Предыдущая версия . Еще …
Отредактировано 17.01.2019 9:38 rg45 . Предыдущая версия .
Отредактировано 17.01.2019 8:01 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.