Разрешение перегрузки с помощью шаблонов

#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. Пожалуйста, добавьте сведения о компиляторе / операционной системе. Может быть, кто-то может отследить это, если поведение действительно таково, как вы описываете.