Информация об изменениях

Сообщение Re[6]: Haters gonna hate but with proofs от 17.01.2019 8:00

Изменено 17.01.2019 9:38 rg45

Re[6]: Haters gonna hate but with proofs
Здравствуйте, _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;
}
Re[6]: Haters gonna hate but with proofs
Здравствуйте, _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;
}