#c
#c
Вопрос:
Недавно у меня возникла проблема с разрешением перегрузки при перегрузке шаблонов, которые ведут себя не так, как я ожидаю. Я просмотрел правила разрешения перегрузки и ничего не нашел относительно моей проблемы, поэтому, если кто-нибудь может сослаться на меня или объяснить, почему он ведет себя так, как он, я был бы очень признателен.
Рассмотрим этот фрагмент кода:
template<unsigned int max_size>
void foo(char (amp; arr)[max_size], unsigned int used_size) {}
void foo(char arr[], unsigned int size) {}
template<unsigned int max_size>
void boo(const char (amp; arr)[max_size], unsigned int used_size) {}
void boo(const char arr[], unsigned int size) {}
main()
{
char arr[10];
foo(arr, 10); // calls second foo
boo(arr, 10); // calls first boo
}
Я не могу понять, почему const влияет на выбор функции так, как это происходит. Я пробовал компилировать как с g , так и с clang, но это не имеет значения.
Заранее спасибо за любые полезные ответы!
Комментарии:
1. Вы уверены? Кажется, что оба вызова должны вызывать вторые версии.
2. Не удается дублировать. ideone.com/srdpje .
3. @Edgar — Нет, я не уверен. 🙂 Я могу объяснить первый случай, но второй слишком сложный для меня.
4. @RSahu да, я думаю, что в обоих случаях будут вызываться вторые версии только потому, что массивы распадаются на указатели, и не имеет значения, объявлен ли размер массива, простая функция соответствует лучше, чем шаблон.
5. Пожалуйста, добавьте сведения о компиляторе / операционной системе. Может быть, кто-то может отследить это, если поведение действительно таково, как вы описываете.