La versione non membro (amico o altro) è preferibile perché può supportare conversioni implicite sul lato sinistro e destro dell'operatore.
Dato un tipo che è implicitamente convertibile in oggetto:
struct Widget
{
operator Object() const;
};
la versione non-membro può essere chiamato solo se un'istanza di Widget
appare sul lato sinistro:
Widget w;
Object o;
o + w; // can call Object::operator+(Object &) since left-hand side is Object
w + o; // can only call operator+(Object &, Object &)
In risposta al tuo commento:
Definendo la conversione op erator in Widget
, stiamo notificando al compilatore che le istanze di Widget
possono essere convertite automaticamente in istanze di Object
.
Widget w;
Object o = w; // conversion
Nell'espressione o + w
, il compilatore chiama Object::operator+(Object &)
con un argomento generato convertendo w
ad un Object
. Quindi il risultato è lo stesso di scrivere o + w.operator Object()
.
Ma nell'espressione w + o
, il compilatore cerca Widget::operator+
(che non esiste) o un membro non membro operator+(Widget, Object)
. Quest'ultimo può essere chiamato convertendo w
in un Object
come sopra.
fonte
2012-10-07 01:03:28
Probabilmente meglio per citare i bit rilevanti dall'ultima domanda, quindi le persone non devono cliccarci sopra (e anche nel caso in cui la domanda scompaia) – nneonneo