Почему затухание указателя имеет приоритет над выведенным шаблоном?
Допустим, я пишу функцию для печати длины строки:
template <size_t N>
void foo(const char (&s)[N]) {
std::cout << "array, size=" << N-1 << std::endl;
}
foo("hello") // prints array, size=5
Теперь я хочу расширитьfoo
поддерживатьне-arrays:
void foo(const char* s) {
std::cout << "raw, size=" << strlen(s) << std::endl;
}
Но оказывается, что это нарушает мое первоначальное предназначение:
foo("hello") // now prints raw, size=5
Зачем? Разве это не потребует преобразования массива в указатель, тогда как шаблон будет точно соответствовать? Есть ли способ убедиться, что моя функция массива вызывается?