При вызове test под номером один, как и следовало ожидать, вызывается специализированная под const char* функция.
При вызове test под номером два — специализированная под char* функция.
Догадайтесь, какую из трех функция вызывает test N3?
Ответ: Общую шаблонную функцию.
Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*.
Или я ошибаюсь?
_>При вызове test под номером один, как и следовало ожидать, вызывается специализированная под const char* функция. _>При вызове test под номером два — специализированная под char* функция.
_>Догадайтесь, какую из трех функция вызывает test N3? _>Ответ: Общую шаблонную функцию.
_>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. _>Или я ошибаюсь?
Точно const char* и в общей шаблонной функции у тебя const T&, т.е. const char*&
Здравствуйте, Tolyan, Вы писали:
T>Здравствуйте, ss_greh, Вы писали:
_>>При вызове test под номером один, как и следовало ожидать, вызывается специализированная под const char* функция. _>>При вызове test под номером два — специализированная под char* функция.
_>>Догадайтесь, какую из трех функция вызывает test N3? _>>Ответ: Общую шаблонную функцию.
_>>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. _>>Или я ошибаюсь?
T>Точно const char* и в общей шаблонной функции у тебя const T&, т.е. const char*&
Здравствуйте, ss_greh, Вы писали:
_>Имеется шаблонная функция, принимающая один аргумент по ссылке на константу. _>И два ее специализированных варианта для const char* и char*.
_>
_>При вызове test под номером один, как и следовало ожидать, вызывается специализированная под const char* функция. _>При вызове test под номером два — специализированная под char* функция.
_>Догадайтесь, какую из трех функция вызывает test N3? _>Ответ: Общую шаблонную функцию.
_>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. _>Или я ошибаюсь?
Вы ошибаетесь.
В процессе вывода аргументов преобразование из массива в указатель происходит только в том случае, если параметр имеет не ссылочный тип. У вас в test("test") аргумент, представляющий собой строковый литерал, который передается шаблонам функций, параметры которых объявлены как параметры ссылочного типа. Т.е. в test("test") параметр передается как ссылка на массив из 5-ти символов. Если вы желаете получить явную специализацию шаблонной функции необходимо воспользоваться перегрузкой для массива, например:
template< typename T, int N >
void test( T const (&t)[N] ) {
}
Или отказаться от использования ссылок, в пользу передачи по значению.
_>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*.
Нет. const char [].
Но существует правило "распада" указателя, не применяющееся в этом случае.
Так что все правильно.
Здравствуйте, Vamp, Вы писали:
_>>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. V>Нет. const char [].
Хорошо. Меня ввела в заблуждение книга Николая Джосаттиса "С++ стандартная библиотека".
В ней черным по белому, в главе посвещенной строкам, написано:
...
Учтите, что тип строковых литералов (например, "hello") был заменен на const char*. Тем не менее
для обеспечение совместимости поддерживается неявное (хотя и нежелательное) преобразование к char*.
...
Буду теперь думать, прежде чем верить печатному слову.
V>Но существует правило "распада" указателя, не применяющееся в этом случае. V>Так что все правильно.
Здравствуйте, ss_greh, Вы писали:
_>Здравствуйте, Vamp, Вы писали:
_>>>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. V>>Нет. const char []. _>Хорошо. Меня ввела в заблуждение книга Николая Джосаттиса "С++ стандартная библиотека". _>В ней черным по белому, в главе посвещенной строкам, написано: _>
_>...
_>Учтите, что тип строковых литералов (например, "hello") был заменен на const char*. Тем не менее
_>для обеспечение совместимости поддерживается неявное (хотя и нежелательное) преобразование к char*.
_>...
_>Буду теперь думать, прежде чем верить печатному слову.
Джосьютис не сказал ничего неверного.
Его слова о типе строковых литералов в главе 11 относятся к конструкторам string, которые получают строковые литералы по значению как const char*. У вас первичный шаблон функции test, (primary template) и его специализации получают ссылку. Поэтому! проявляется проблема несоответствия между массивом символов и указателем на символы.
Если обьявить первичный шаблон функции test получающим указатель, затем, специализировать его типом const char*, вы получите вызов специализации const char* в строке N3 вашего первого поста, которую вы и ожидали в первом посте.
template<class T>
void test(const T* t) {
}
template<> // в строке N3 вызов будет сюдаvoid test( const char* t ) {
}
Здравствуйте, Demay, Вы писали:
D>Здравствуйте, ss_greh, Вы писали:
_>>Здравствуйте, Vamp, Вы писали:
_>>>>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. V>>>Нет. const char []. _>>Хорошо. Меня ввела в заблуждение книга Николая Джосаттиса "С++ стандартная библиотека". _>>В ней черным по белому, в главе посвещенной строкам, написано: _>>
_>>...
_>>Учтите, что тип строковых литералов (например, "hello") был заменен на const char*. Тем не менее
_>>для обеспечение совместимости поддерживается неявное (хотя и нежелательное) преобразование к char*.
_>>...
_>>Буду теперь думать, прежде чем верить печатному слову.
D>Джосьютис не сказал ничего неверного. D>Его слова о типе строковых литералов в главе 11 относятся к конструкторам string, которые получают строковые литералы
Цитата, приведенная мною выше, взята из краткого предисловия к 11 главе. В нем ни слова не говорится о конструкторах класса basic_string<>, зато дается определение тому, что можно понимать под строкой.
Именно в этом контексте Nicolai Josuttis пишет про тип строковых литералов.
Здравствуйте, kvas, Вы писали:
K>P.S. Кстати, пару минут назад видел чье-то сообщение с таким-же кодом. Потом его удалили. Почему?
Мое. Только когда его запостил, то увидел сообшения от Vamp и Demay, и понял что мое становиться просто бессмысленным, и сам удалил его (что бы не повторяться). А по поводу того являеться ли она перегрузкой или специализацией, не знаю. Слишком мутно все в языке C++
ss_greh wrote:
> Догадайтесь, какую из трех функция вызывает test N3? > Ответ: Общую шаблонную функцию. > > Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*. > Или я ошибаюсь?