2011-08-30 48 views
15

Recentemente ho scoperto che esiste un concetto di riferimento in funzione in C++ :). Così come ci sono tipi di funzione pointer-to-function e pointer-to-member-type. La domanda sorge spontanea. Esiste un concetto di "riferimento a membro-funzione"?Riferimento alla funzione membro?

Ho provato a compilare il seguente codice, ma GCC 3.4.6 restituisce un errore.

#include <iostream> 

using namespace std; 

class A { 
public: 
    virtual void Af() const { 
    cout << "A::Af()" << endl; 
    } 
}; 

int main() { 
    typedef void (A::& MemFnc)() const; 
    MemFnc mf = &A::Af; 

    A a; 
    (a.*mf)(); 

    return 0; 
} 
+3

gcc 3.4.6? Dovresti considerare di aggiornare il compilatore. Inoltre, quando si chiede del codice che attiva gli errori del compilatore, di solito è una buona idea fornire il messaggio di errore effettivo (partendo dal primo errore nell'output) e identificare la linea in cui si lamenta il compilatore. –

+0

Non ho il permesso di aggiornare GCC :(. Non ho fornito il codice di errore perché penso che in questo caso non importa quale tipo di errore dia, la parte essenziale è che non capisce questa sintassi – MKo

+0

Se ci fosse un riferimento al membro, quale sintassi dovrebbe essere usata per usarlo? Un puntatore-membro è usato con '. *', Quindi l'uso comune suggerisce che il riferimento al membro dovrebbe essere semplicemente cadere la stella, che risulta per essere chiari '.'?! Che è esattamente lo stesso di usare un membro ordinario – Sjoerd

risposta

20

Non esiste una cosa chiamata riferimento al membro in C++.

La specifica del linguaggio dice esplicitamente in una nota (§8.3.3/3 - 2003) che,

Un puntatore a membro non deve puntare a un membro statico di una classe (9.4), un membro con tipo di riferimento, o "cv void." [Nota: vedere anche 5.3 e 5.5. Il tipo "puntatore al membro" è distinto dal tipo "puntatore", ovvero un puntatore al membro viene dichiarato solo dal puntatore alla sintassi del dichiaratore membro e mai dalla sintassi del dichiaratore del puntatore. Non esiste un tipo "reference-to-member" in C++.

+2

Tecnicamente, ciò che viene evidenziato in ** grassetto ** non è normativo in quanto è solo una nota. –

+0

@Charles: Sì. Lo so, ma è facile da leggere e capire, ecco perché l'ho citato – Nawaz

+5

Il mio punto è il punto in cui si dice "La specifica del linguaggio dice esplicitamente", è un po 'ingannevole perché la specifica non dice esplicitamente " non c'è "riferimento" "tipo" di ence-to-member, omette semplicemente di fornirne uno. –

1

Non c'è alcun riferimento alla funzione membro.

1

No, i riferimenti alle funzioni membro non sono possibili.

In un certo senso, il risultato di dereferenziazione un puntatore a una funzione di membro potrebbe servire come uno, ma l'unica cosa che si può fare con questo risultato è quello di richiamare un operatore di funzione di chiamata su di esso, per 5.5[expr.mptr.oper]/6. Nient'altro è permesso.

Problemi correlati