Почему в C++ я не могу взять адрес функции, у которой также есть шаблонная версия?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Почему в C++ я не могу взять адрес функции, у которой также есть шаблонная версия?

Сообщение Гость »

Вот фрагмент кода, который пытается предоставить указатель перегруженной функции на другую функцию, которая может принимать значение любого типа:

Код: Выделить всё

template 
void AcceptAnything(T&&);

void Foo();

template 
void Foo();

void Bar() {
AcceptAnything(&Foo);
}
Это не удается скомпилировать, и в clang выдается следующая ошибка:

Код: Выделить всё

:10:3: error: no matching function for call to 'AcceptAnything'
10 |   AcceptAnything(&Foo);
|   ^~~~~~~~~~~~~~
:2:6: note: candidate template ignored: couldn't infer template argument 'T'
2 | void AcceptAnything(T&&);
|      ^
Я понимаю, почему вы не можете сделать это для перегруженной функции в целом. Но в данном конкретном случае я удивлен, что &Foo не имеет типа void(*)(), учитывая, что аргументы шаблона не указаны. Моя ментальная модель такова:
  • Единственная функция с именем Foo здесь — нешаблонная, а другая — семейство функций. с именем Foo для любого типа T.
  • Выражение &Foo относится к адрес конкретной функции с именем Foo.
  • Не существует такой вещи, как адрес семейства функций.
Поэтому я ожидаю, что &Foo однозначно означает «указатель на нешаблонную функцию Foo» . Но и gcc, и clang со мной не согласны, поэтому моя мысленная модель, должно быть, неверна.
Почему &Foo неоднозначен в этом случае и какая часть стандарта охватывает это?

Подробнее здесь: https://stackoverflow.com/questions/781 ... lated-vers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»