Nel seguente codice C++ 11:Inizializzatore C++ 11 con funzione id-espressione ambigua?
void f(int) {}
void f(double) {}
void (*p)(int) = f;
Ci sono due funzioni.
Il terzo identificatore f
è un'espressione id e l'inizializzatore di p
.
In 5.1.1p8 [expr.prim.general]/8 si legge:
Il tipo di [id-espressione] è il tipo di identificatore. Il risultato è l'entità denotata dall'identificatore. Il risultato è un lvalue se l'entità è una funzione, una variabile o un membro dati e un valore diverso altrimenti.
Dato che f
potrebbe riferirsi a due soggetti diversi con due tipi differenti, non c'è "l'entità" o "tipo".
C'è qualche altro testo nello standard che risolve questa situazione?
Le implementazioni non sono altro che una disambiguazione come estensione o sono richieste da qualche parte? (. Senza qualche altro testo si potrebbe sostenere che un'implementazione potrebbe rifiutare la f id-espressione ambigua)
Non ho prove, ma io * penso * questo non è ambiguo. Considera cosa succede quando una funzione sovraccaricata è ** chiamata. ** 'f (T1)' vs. 'f (T2)'. Qui, il compilatore dovrebbe decidere quale funzione (puntatore) deve chiamare. IMO questo è un caso simile. (e +1, finalmente una buona domanda sul C++!) –
Questo è richiesto dallo standard, ma non ricordo il testo che lo tratta. Fammi cercare. – Nawaz
@ DietmarKühl Bene, questo è quello che sto dicendo ... –