Сообщение 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
__>Ух ты! А почему, когда длины строк равны, они интерпретируются как 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
__>Ух ты! А почему, когда длины строк равны, они интерпретируются как 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;
}