5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

Il compilatore si lamenta: error C2065: 'X' : undeclared identifierPerché C++ 11 non supporta la ricerca del nome in questo modo?

Il compilatore sa quello del costruttore tipo di parametro è, così quando passo X come argomento, il compilatore dovrebbe sapere che è un argomento valido.

So che questo non è ADL (ricerca del nome dipendente dall'argomento, noto anche come Koenig Lookup), ma penso che sia utile e molto utile. Perché io non devo scrivere come segue:

A a(A::X); 

penso che la regola ADL dovrebbe essere generalizzata ad un caso del genere.

Ho ragione?

+2

Questo è come l'inverso di ADL ... FDL (ricerca dipendente dalla funzione). –

+9

Hai considerato come questo si applicherebbe quando hai anche una variabile locale chiamata 'X'? E a prescindere, il modo in cui leggo la tua domanda, stai dicendo che questo è C++ non valido, e stai chiedendo se lo standard C++ dovrebbe cambiare. Questo è il posto sbagliato per quello. – hvd

+0

Grazie, hvd. Ci hai dato una motivazione convincente. – xmllmx

risposta

10

Le chiamate di funzione in C++ sono soggette alla risoluzione di sovraccarico della funzione. La risoluzione del sovraccarico è determinata dai tipi di argomenti. Cioè la lingua "funziona" specificamente in quella direzione: da tipi di argomenti a versione specifica della funzione con il nome specificato.

Si propone di introdurre un processo inverso - deduzione del tipo di argomento in base al nome della funzione. Questo non funzionerà nel caso generale. Potrebbe funzionare nei casi in cui esiste una sola funzione candidata (come nel tuo esempio), ma, di nuovo, è contraria ai principi che funzionano nella situazione generale quando la funzione è sovraccaricata.

Ovviamente, la situazione diventerà ancora più complicata quando la ricerca del nome su nome non qualificato X può vedere qualcos'altro chiamato X in aggiunta al tuo A::X. Penso che possa facilmente diventare molto controintuitivo.

+0

Capisco gli argomenti di complessità che si applicano in generale. Quindi, forse non in generale, ma per qualche ragione penso che sarebbe particolarmente utile per 'enums'. Poiché spesso servono come opzioni nominate arbitrariamente per le funzioni. – alfC

4

Penso che la regola ADL debba essere generalizzata in questo caso.

No grazie.

C++ ha la sua parte di (brutte) sorprese (quale altra lingua conoscete richiede explicit come parola chiave?), E non vedo abbastanza merito nell'esempio da aggiungere a questo elenco di regole linguistiche impreviste che ostacolano il mio codice in situazioni impreviste.

Se si rileva che la digitazione aggiuntiva associata al nome della classe seguita dai due due punti è troppo impegnativa, allora sicuramente la natura barocca generale della sintassi del C++ avrebbe dovuto scoraggiare ora?

Problemi correlati