Почему уступает приоритет преобразование указателя над выведенным шаблоном?
У меня возникла проблема с перегрузкой функции в C++, и я не могу понять, почему происходит такое поведение. Я написал функцию для вывода длины строки, которая принимает массив:
template <size_t N>
void foo(const char (&s)[N]) {
std::cout << "array, size=" << N-1 << std::endl;
}
foo("hello"); // выводит array, size=5
Теперь я хочу расширить функцию foo
, чтобы поддерживать также строки, передаваемые как указатели:
void foo(const char* s) {
std::cout << "raw, size=" << strlen(s) << std::endl;
}
Но, как оказалось, это нарушает изначально задуманное поведение:
foo("hello"); // теперь выводит raw, size=5
Почему это происходит? Разве это не должно требовать преобразования массива в указатель, и тем более шаблон должен быть точным совпадением? Есть ли способ гарантировать, что будет вызвана функция для массива?
Как объявить 2D массив в C++ с использованием оператора new?
Как определить длину массива?
Копирование не нуль-терминированного массива unsigned char в std::string
Неопределенная ссылка на виртуальную таблицу (vtable)
Как проверить, содержит ли массив строку в TypeScript?