Tipo de retorno do operador de atribuição
Ao definir um operador de atribuição, ele fica invariavelmente assim:
class X {...};
X& X::operator=(...whatever...);
Ou seja, tem o tipo de retorno "referência ao X". Aqui, parâmetros (...whatever...
) pode serX&
, const X&
, somenteX
ao usar oidioma de cópia e trocaou qualquer outro tipo.
Parece estranho quetodo mundo recomenda retornar uma referência não-const paraX
, independentemente dos parâmetros. Isso permite explicitamente expressões como(a = b).clear()
, o que é suposto ser bom.
Eu tenho uma opinião diferente, e eu quero proibir expressões como(x=y).clear
, (x=y)=z
, e até mesmox=y=z
no meu código. Minha ideia é que essas expressões fazem coisas muito complexas em uma única linha de código. Então decidi que meus operadores de atribuição retornassemvoid
:
void X::operator=(X) {...}
void X::operator=(int) {...}
Quais efeitos negativos isso tem? (exceto parecer diferente do habitual)
Minha classe X pode ser usada com contêineres padrão (por exemplo,std::vector<X>
)
Eu estou usando o C ++ 03 (se isso importa).