sobre manejo lenguaje ficheros ejercicios con clase archivos c++ pointers reference pointer-to-member

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.