2011-08-30 16 views
15

Recientemente descubrí que hay un concepto de referencia a la función en C++ :). Por lo tanto, existen diferentes tipos de función de puntero a función y de función de puntero a miembro. Surge la pregunta. ¿Hay un concepto de "referencia a la función de miembro"?¿Referencia a la función miembro?

He intentado compilar el siguiente código, pero GCC 3.4.6 da un error.

#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? Debería considerar actualizar el compilador. Además, al preguntar sobre el código que desencadena los errores del compilador, generalmente es una buena idea proporcionar el mensaje de error real (comenzando desde el primer error en el resultado) e identificar la línea donde se queja el compilador. –

+0

No tengo permiso para actualizar GCC :(. No proporcioné el código de error porque creo que en este caso no importa qué tipo de error dé, la parte esencial es que no entiende esta sintaxis. – MKo

+0

Si hubiera una referencia al miembro, ¿qué sintaxis debería usarse para usarla? Un puntero-a-miembro se usa con '. *', Por lo que el uso común sugiere que la referencia al miembro debería ser simplemente descartar la estrella, lo que resulta para ser simple '.' ?! que es exactamente lo mismo que usar un miembro ordinario. – Sjoerd

Respuesta

20

No existe una cosa llamada referencia al miembro en C++.

La especificación del lenguaje dice explícitamente en una nota (§8.3.3/3 - 2003) que,

Un puntero a miembro no apuntar a un miembro estático de una clase (9.4), un miembro con tipo de referencia o "cv void". [Nota: consulte también 5.3 y 5.5. El tipo "puntero al miembro" es distinto del tipo "puntero", es decir, un puntero al miembro se declara únicamente por el puntero a la sintaxis del declarante del miembro y nunca por la sintaxis del declarador del puntero. No hay ningún tipo de "referencia al miembro" en C++.

+2

Técnicamente, lo que se resalta en ** negrita ** no es normativo, ya que es solo una nota. –

+0

@Charles: sí. Lo sé. Pero eso es fácil de leer y entender. Por eso lo cité. – Nawaz

+5

Mi punto es cuando dices "La especificación del lenguaje explícitamente dice", es un poco falso porque la especificación no dice explícitamente ' no hay "referencia" "tipo" de la persona a miembro, simplemente omite proporcionar uno. –

1

No hay referencia a la función de miembro.

1

No, las referencias a funciones miembro no son posibles.

En cierto sentido, el resultado de la eliminación de referencias a un puntero a una función miembro podría servir como uno, pero lo solamente se puede hacer con ese resultado es invocar un operador de llamada de función en ella, por 5.5[expr.mptr.oper]/6. Nada más está permitido.

Cuestiones relacionadas