c++ - Justificación de obligar a algunos operadores a ser miembros
operator-overloading c++-faq (2)
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:
operator =
-
operator ()
-
operator ->
-
operator []
Este hilo explica perfectamente la razón detrás de prohibir operator =
ser una función no miembro. Alguna idea sobre los otros tres?
Este thread en comp.std.c ++ discute la pregunta.
Francis Glassborow, que estaba en el comité, declaró:
Los diseñadores de idiomas no desearon admitir conversiones y promociones en el operando de la izquierda de operator =, ni en el operando de () y [].
Intentando evitar la situación donde:
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();
}
Los cuatro operadores mencionados en la publicación original, =
, ()
, ->
y []
, deben de hecho implementarse como funciones miembro no estáticas (por C ++ 98 §13.5.3 / 1, §13.5.4 / 1 respectivamente) , §13.5.5 / 1 y §13.5.6 / 1).
El razonamiento de Bjarne Stroustrup fue, como recuerdo de debates anteriores sobre el tema, mantener cierta sensatez en el lenguaje, es decir, tener al menos algunas cosas en las que podría confiar sin importar cuánto haya alterado Alguien más definiendo operadores no miembros para el existente clases
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 y hth.,
PD: El libro "El diseño y la evolución de C ++" es ideal para este tipo de preguntas, pero desafortunadamente no lo tengo.