Die Nichtmitgliedsversion (Freund oder nicht) wird bevorzugt, da sie implizite Konvertierungen sowohl auf der linken als auch auf der rechten Seite des Operators unterstützen kann.
eine Art gegeben, die implizit konvertierbar ist zu diesem Objekt
kann
struct Widget
{
operator Object() const;
};
Nur die Nicht-Mitglied-Version, wenn eine Instanz von Widget
erscheint auf der linken Seite aufgerufen werden:
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 &)
Als Antwort auf Ihren Kommentar:
Durch die Definition der Konvertierung op Erator in Widget
, wir informieren den Compiler, dass Instanzen von Widget
automatisch in Instanzen von Object
konvertiert werden können.
Widget w;
Object o = w; // conversion
Im Ausdruck o + w
, ruft der Kompilierer Object::operator+(Object &)
mit einem Argument, erzeugt durch w
zu einer Object
umwandelt. Das Ergebnis ist das gleiche wie das Schreiben o + w.operator Object()
.
Aber im Ausdruck w + o
sucht der Compiler nach Widget::operator+
(die nicht existiert) oder ein Nichtmitglied operator+(Widget, Object)
. Letzteres kann durch Umwandlung von w
in Object
wie oben beschrieben aufgerufen werden.
Wahrscheinlich besser die entsprechenden Bits zu zitieren von der letzten Frage, damit die Leute nicht durchklicken müssen (und auch für den Fall, dass die Frage verschwindet) – nneonneo