Soy un gran admirador de dejar que el compilador haga el mayor trabajo posible por usted. Al escribir una clase simple, el compilador puede darle lo siguiente de forma gratuita:
- Un constructor (vacío) predeterminado
- Un constructor de copias
- Un destructor
- Un operador de asignación (
operator=
)
Pero parece que no puede darle ningún operador de comparación, como operator==
o operator!=
. Por ejemplo:
class foo
{
public:
std::string str_;
int n_;
};
foo f1; // Works
foo f2(f1); // Works
foo f3;
f3 = f2; // Works
if (f3 == f2) // Fails
{ }
if (f3 != f2) // Fails
{ }
¿Hay alguna buena razón para esto? ¿Por qué sería un problema realizar una comparación miembro por miembro? Obviamente, si la clase asigna memoria, entonces querrás tener cuidado, pero para una clase simple, ¿seguramente el compilador podría hacer esto por ti?
==
, de la misma manera que hay una asignación automática predeterminada ( =
) bajo ciertas condiciones. (El argumento sobre los punteros es inconsistente porque la lógica se aplica tanto para =
y ==
, y no solo para el segundo).