2011-09-09 12 views

Respuesta

10

No es "malo", pero sorprendente. Una tarea evalúa al objeto de destino. Eso es lo que significa el builtin. Si lo defines diferente para tu propia clase, las personas podrían confundirse.

Ejemplo:

int c; 
while((c = getchar()) != EOF) { 
    // ... 
} 

La asignación a c volvió c sí mismo y lo comparó con EOF después. Los usuarios esperarían que su clase item se comportara de manera similar.

5

La firma con vacío no permitiría que las asignaciones encadenadas:

a = b = c; 

(. Mira respuesta Johannes' para un ejemplo más de un patrón de uso basado en la asignación de devolver el valor asignado)

Es por eso usar tales firmas no se recomienda. Sin embargo, si no me equivoco, en realidad puede usar dicha firma.

+0

y, fundamentalmente, esto es lo que los tipos incorporados hacen –

2

Es perfectamente legal. Pero cuando se declara operator= así, usted no será capaz de hacer "cadena de asignación":

item a(X); 
item b; 
item c; 
c = b = a; 

de referencia permite la modificación de valor devuelto. Como el operator= se evalúa de derecha a izquierda, el uso que le mostré está funcionando.

EDIT Además, como mencionan otros, el valor de retorno se utiliza a menudo en expresiones como while (a = cin.get()) != 'q'). Pero también puede declarar operador como A operator=(const A&) (devuelve copia) o const A& operator(const A&) (devuelve referencia de referencia). Mi punto es: este operador puede devolver cualquier cosa, pero la forma idiomática es devolver la referencia no const a sí mismo.

+1

No solo eso, al declarar 'operator =' como 'void' devuelto no podrá usar el resultado de la tarea en ninguna expresión. –

Cuestiones relacionadas