c++ - Tipo de devolución del operador de asignación
assignment-operator (1)
Cuando se define un operador de asignación, siempre se ve así:
class X {...};
X& X::operator=(...whatever...);
Es decir, tiene el tipo de retorno "referencia a X". Aquí, los parámetros ( ...whatever...
) pueden ser X&
, const X&
, solo X
cuando se usa el modismo de copia e intercambio , o cualquier otro tipo.
Parece extraño que todos recomienden devolver una referencia no constante a X
, independientemente de los parámetros. Esto permite explícitamente expresiones como (a = b).clear()
, que se supone que es buena.
Tengo una opinión diferente, y quiero rechazar expresiones como (x=y).clear
, (x=y)=z
, e incluso x=y=z
en mi código. Mi idea es que estas expresiones hacen cosas demasiado complejas en una sola línea de código. Así que decidí que mis operadores de asignación devuelvan el void
:
void X::operator=(X) {...}
void X::operator=(int) {...}
¿Qué efectos negativos tiene esto? (excepto luciendo diferente de lo usual)
¿Se puede usar mi clase X con contenedores estándar (por ejemplo, std::vector<X>
)?
Estoy usando C ++ 03 (si eso importa).
Su clase no cumple con el concepto CopyAssignable (§17.6.3.1), por lo que la norma ya no garantiza que funcione con los contenedores estándar que lo requieren (por ejemplo, std::vector
requiere esto para las operaciones de insert
).
Además, este comportamiento no es idiomático y será percibido como sorprendente por los programadores que usan su código. Si desea deshabilitar el encadenamiento, considere agregar una función nombrada que realice la asignación en su lugar.
Simplemente no intentes cambiar el comportamiento de los operadores idiomáticos de manera sutil como esta. Hará que su código sea más difícil de leer y mantener.