Почему уступает приоритет преобразование указателя над выведенным шаблоном?
У меня возникла проблема с перегрузкой функции в 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?
Как определить длину массива?
Как удалить элемент из std::vector<> по индексу?
Проверка присутствия элемента в массиве
`unsigned int` против `size_t`: когда и что использовать?