Recientemente he leído (y por desgracia recuerdo donde), que la mejor manera de escribir operador = es la siguiente:copia explícita constructor o parámetro implícito por valor
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
en lugar de esto:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
La idea es que si operator = se llama con un valor r, la primera versión puede optimizar la construcción de una copia. Entonces cuando se llama con un valor r, la primera versión es más rápida y cuando se llama con un lvalue los dos son equivalentes.
Tengo curiosidad por saber qué piensan los demás acerca de esto? ¿La gente evitaría la primera versión por falta de claridad? ¿Estoy en lo correcto al decir que la primera versión puede ser mejor y que nunca puede ser peor?
¿Qué es 'swap'? Si es 'foo temp = x; x = y; y = temp; 'tiene la recursión infinte de la función' operator = 'y' swap'. –
Escribí un programa para probar la teoría de @Alexey Malistov y él estaba en lo correcto: obtuve recurrencia infinita. – nobar
Cualquier clase que implemente un modificador de copia y de intercambio no puede confiar en la implementación 'std :: swap' predeterminada en su operador de asignación de copias. Eso prácticamente no hace falta decirlo. –