c++ - lenguaje - manejo de archivos en c pdf
¿Por qué la referencia-a-miembro no existe en C++? (1)
En C ++ puedo elegir punteros de función y referencias de función (o incluso valores de función en aras de la integridad):
void call_function_pointer (void (*function)()) {
(*function) ();
}
void call_function_reference (void (&function)()) {
function ();
}
void call_function_value (void function()) {
function ();
}
Sin embargo, cuando se trata de métodos, no parece tener esta opción entre punteros y referencias.
template <class T> void call_method_pointer (T* object, void (T::*method)()) {
(object->*method) ();
}
// the following code creates a compile error
template <class T> void call_method_reference (T& object, void (T::&method)()) {
object.method ();
}
Esto me lleva a suponer que las referencias a métodos no existen en C ++. ¿Es eso cierto? Si es así, ¿cuál es la razón por la que no existen?
En el estándar (por ejemplo, N3337 - no es el último pero está bien para esto) hay una nota al final de la sección 8.3.3.3 que dice:
[Nota: Ver 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 para miembro" en C ++. - nota final]
Además, por supuesto, no hay operadores de tipo "referencia a miembro" (que, hipotéticamente, lo mejor que se me ocurre sería algo así como ->&
y .&
, Aunque estos no son consistentes con la desreferencia de datos y referencias de función , que no requieren un operador especial).
¿Por qué?
En cuanto a por qué; después de una pequeña y divertida investigación histórica y al no encontrar ninguna nota existente sobre ella (volví a Cfront 2.0 donde primero se apoyó el puntero a miembro) , edite: de acuerdo con un documento mucho más creíble , la función era en realidad primero soportado en Cfront 1.2 ), le pregunté al hombre mismo y aquí está la respuesta:
Date: Sat, 22 Feb 2014 10:12:51 -0500 From: Bjarne Stroustrup <...> Subject: Re: On lack of reference-to-member and CFront 2.0 On 2/22/2014 6:40 AM, Jason C wrote: > My question is: C++ very clearly disallows the concept of > "reference-to-member". Why is this? I have been doing a lot of > research, and I traced the origin of "pointer-to-member" back (I > think) to 1989 CFront 2.0. I read through the product reference manual > and other documentation hoping to find an explanation of some sort but > could not. I don''t really remember. It was 25+ years ago and the ARM is silent on this. I added pointers to members to eliminate the need for a rare breakage of the type system. I suspect that I didn''t add references to members because it did not seem worth the effort: there was no use case.
Para ser sincero, esperaba algo mucho más arcano y complicado.
Así que ahí lo tienen: la próxima vez que alguien pregunte por qué no hay referencia a miembro, puede decir con confianza: "¡Porque no lo hay!" (Nota: vea mis divagaciones en los comentarios, todavía hay alguna investigación histórica por hacer para llegar al 100% de confianza).
Personalmente, nunca he encontrado un uso para los punteros a miembros en mi propio código, pero se da una lógica distinta para su existencia en The Evolution of C ++ de Stroustrup : 1985-1989 , pp. 222-223.
Por cierto, su sintaxis para llamar a la función hipotética de referencia a miembro:
object.method();
... no tiene mucho sentido, ya que no hay forma de distinguir sintácticamente de una llamada a un miembro real llamado method()
.
hvd trae a colación un buen punto a continuación: Como puede ver en lo anterior, sintácticamente, no existiría una forma consistente de desreferenciar una referencia a miembro. Tiene que distinguirlo del acceso normal a miembros, pero al mismo tiempo quiere que sea coherente con la eliminación de referencias de objetos y funciones (que no requieren un operador especial), y realmente no puedo pensar en nada que logre ambas cosas.