Si le preocupa que devolver algo incorrecto puede causar silenciosamente efectos secundarios no deseados, puede escribir operator=()
para devolver void
. He visto un poco de código que hace esto (asumo por pereza o simplemente no saber cuál debería ser el tipo de devolución en lugar de "seguridad"), y causa pocos problemas. El tipo de expresiones que necesitan utilizar la referencia normalmente devuelta por operator=()
se usan muy raramente, y casi siempre son fáciles de codificar.
No estoy seguro de que respaldaría devolver void
(en una revisión del código, probablemente lo llamaría algo que no debería hacer), pero lo estoy considerando como una opción para considerar si no quiere preocuparse por cómo se manejarán los usos extraños del operador de asignación.
fines de edición:
Además, debo tener inicialmente mencionado que se puede dividir la diferencia por tener su operator=()
devolver un const&
- que todavía permita la asignación de encadenamiento:
a = b = c;
Pero deshabilitará algunos de los usos más inusuales:
(a = b) = c;
Tenga en cuenta que esto hace que el operador de asignación tenga una semántica similar a la que tiene en C, donde el valor devuelto por el operador =
no es un valor l. En C++, el estándar lo cambió para que el operador =
devuelva el tipo del operando izquierdo, por lo que es un valor l, pero como Steve Jessop señaló en un comentario a otra respuesta, mientras que eso hace que el compilador acepte
(a = b) = c;
incluso para incorporados, el resultado es un comportamiento indefinido para los integradores ya que a
se modifica dos veces sin ningún punto de secuencia intermedio. Ese problema se evita para los builtins con operator=()
porque la llamada a la función operator=()
es un punto de secuencia.
Si quieres que la gente considere la asignación como una declaración en lugar de una expresión, podrías devolver 'void'. Eso detendrá '(a = b) = c',' a = (b = c) 'y cualquier otra chanchullería que pueda haber revelado la diferencia entre un valor y una referencia. –
Encontré útil devolver el vacío en el operador de asignación cuando necesitaba evitar la destrucción automática de objetos a medida que salían de la pila. Para los objetos contados por ref, no quiere que se invoquen destructores cuando no los conoce. – cjcurrie