2010-10-14 8 views
21

Hay 4 operadores en C++ que pueden estar sobrecargados pero no pueden sobrecargarse como funciones independientes (también conocidas como no miembros, independientes). Estos operadores son:Justificación de hacer que algunos operadores sean miembros

  • operator =
  • operator()
  • operator ->
  • operator []

This thread explica perfectamente la razón de la prohibición operator = a ser una función no miembro. Alguna idea sobre los otros tres?

+3

Estoy bastante seguro de '-> *' puede ser implementado como una función no miembro. –

+2

@James: Estás en lo cierto. @Armen: Probablemente solo miopía. – GManNickG

+0

@James. El libro C++ en pocas palabras dice lo contrario ... –

Respuesta

18

Los cuatro operadores mencionados en la publicación original, =, (), -> y [], de hecho deben ser implementados como funciones miembro no estáticos (por respectivamente C++ 98 §13.5.3/1, §13.5.4/1, §13.5.5/1 y §13.5.6/1).

El fundamento de Bjarne Stroustrup fue, como recuerdo de debates anteriores sobre el tema, mantener cierta cordura en el lenguaje, es decir, tener al menos algunas cosas en las que puede confiar sin importar cuánto haya alterado Alone Else al definir no operadores miembros para las clases existentes.

No estoy seguro de estar completamente de acuerdo con que la restricción realmente ayude con eso, pero.

EDIT: consulté a Bjarne Stroustrup sobre esto (siempre es útil) pero parece que las aparentes inconsistencias de las reglas no son más que un caso de accidente histórico congelado. Señala que "se ve peor ahora de lo que era porque nuestras reglas para los valores y las referencias han cambiado desde que se formularon las reglas de sobrecarga. Intenté examinar este tema nuevamente hace un par de años, pero me quedé sin tiempo antes de producir un completar la propuesta ".

Saludos & HTH,

PS:. Libro "El diseño y evolución de C++" es ideal para este tipo de preguntas, pero por desgracia no lo tienen.

+0

¿Y cuál es exactamente en este caso la diferencia principal entre -> y -> *? ¿Por qué uno no puede ser un no miembro mientras que el otro puede? Por cierto, estoy abierto a respuestas como "no hay una razón seria. Es ilógico, pero así son las cosas", aunque ciertamente me decepcionaría si fuera el caso –

+0

@Armen: buena pregunta. No lo sé. Tal vez esto se explica "El diseño y la evolución", y si es así, tal vez alguien que tenga ese libro haga sonar la voz. Revisé el viejo ARM, parece que no lo discuto. –

+0

La razón para '=' se presenta efectivamente en D & E y es válida hasta el día de hoy. No sé por qué esta restricción también se impuso en '()', '[]' y '->' embargo. – AnT

2

Este thread en comp.std.C++ analiza la cuestión.

Francis Glassborow, que estaba en el comité, declaró:

Los diseñadores del lenguaje no quieren apoyar las conversiones y promociones en el operando de la izquierda del operador =, ni a los que en la operando de() y [].

Tratando de evitar la situación en la que:

class A {}; 

class B { B(A& a) {} }; 

int operator()(B const& b) { return 0; } 


int main(void) 
{ 
    A a; 

    // This works even though A doesn't have a() operator 
    // It creates a temporary B and calls operator()(B& b) 
    return a();     
} 
+3

Nit: necesitarías 'int operator() (B const & b)' para evitar tratar de vincular un temporal a una referencia a no-'const'. De todos modos, la pregunta de Armen sobre '-> *' sigue en pie. –

+2

"Los diseñadores de idiomas no desearon admitir conversiones y promociones en el operando de la izquierda de()". Sin embargo, permiten que cuando una clase declara una función de conversión a puntero-a la función ... –

+0

@Alf Gracias - modificado. – Dingo

Cuestiones relacionadas