2013-06-02 14 views
7

Il seguente codice:Perché non è possibile ottenere il puntatore al membro dal nome della funzione membro non qualificato in C++ 11?

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &f; 
    } 
}; 

risultati in:

error: ISO C++ forbids taking the address of an unqualified 
or parenthesized non-static member function to form a pointer 
to member function. Say ‘&X::f’ 

La mia domanda è, perché è questo non permesse e proibite dalla norma? Sarebbe più conveniente che un utente non lo qualificasse, quindi presumo ci sia qualche altra motivazione (sicurezza? Un'ambiguità? Facilità di implementazione del compilatore?) Per il requisito?

+0

Questa risposta precedente sembra affrontare la questione: http://stackoverflow.com/a/7138582 –

risposta

6

pointer-to-member è abbastanza raro da consentire un trattamento speciale e non necessariamente il più economico. È stato deciso che l'unica forma accettata è quella citata nel messaggio di errore. Quella forma non si scontra con nient'altro in nessuna circostanza. E impedisce l'ambiguità di forme più rilassate.

La pratica mostra una scarsa conoscenza dei PTMF e il fatto che fondamentalmente differiscono dalle funzioni. f o & f è probabilmente una richiesta per una funzione normale. Uno che non può essere servito per un membro non statico. E quelli che in realtà intendono PTMF lo dicono aggiungendo lo & X :: part.

+1

Non voglio essere scortese nel chiedere le seguenti - ma la tua risposta è speculativa? o hai la conoscenza diretta che questa era la logica alla base della decisione? –

+1

non completamente speculativo. Ho fatto questa stessa domanda 10 anni fa su comp.std.C++ di fronte a un problema simile la prima volta. (Codice di porta IIRC da MSVC5 a gcc che era più pignolo). È il mio miglior ricordo delle risposte che ho ricevuto da persone che lavorano per lo più o da WG21. Puoi provare a scavare uno di quei fili. –

0

Stai prendendo l'indirizzo di una funzione membro, non una funzione, e ciò significa che dovrai chiamarla anche in modo diverso.

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &X::f; 
     h(); 
    } 
}; 

produce:

 
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘h (...)’, e.g. ‘(... ->* h) (...)’ 
Problemi correlati