Подтвердить что ты не робот

Инициализатор С++ 11 с неоднозначным идентификатором функции id?

В следующем коде С++ 11:

void f(int) {}
void f(double) {}

void (*p)(int) = f;

Есть две функции.

Третий идентификатор f - это id-выражение и инициализатор p.

В 5.1.1p8 [expr.prim.general]/8 говорится:

Тип [id-expression] - это тип идентификатора. Результатом является объект, обозначенный идентификатором. Результатом является lvalue, если объект является функцией, переменной или элементом данных и в противном случае значением prvalue.

Учитывая, что f может ссылаться на два разных объекта с двумя разными типами, нет "объекта" или "типа".

Есть ли какой-нибудь другой текст в стандарте, который обращается к этой ситуации?

Реализации просто устраняют это как расширение или что-то требуется? (Без какого-либо другого текста можно утверждать, что реализация может отклонить выражение f id как неоднозначное.)

4b9b3361

Ответ 1

Стандарт (в п. 13.4) определяет, что:

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

Акцент на мой.

После цитаты есть пример (в § 13.4/5), который похож на ваш:

int f(double);
int f(int);
int (*pfd)(double) = &f; // selects f(double)
int (*pfi)(int) = &f; // selects f(int)

Что касается унарного &, стандарт указывает, что (в § 5.3.1/6 и благодаря jogojapan):

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

но также можно опустить (в § 13.4/1):

Перегруженному имени функции может предшествовать оператор и.

(опять же, акцент мой), как и вы, в вашем примере.