Ich habe eine einfache Struktur Wrapper
, die sich durch zwei Überladungen des zugewiesenen Zuweisungsoperators unterscheidet:
Ich erkläre dann a und b:
%Vor% das Zuweisen von b
zu a
verwendet die Überladungsoperator-Überladung von oben, die nicht konstant ist, und die Zahl "2" wird angezeigt.
Was mich verwirrt, ist folgendes: Wenn ich c
und d
deklariere,
und zuweisen d
zu c
, keine der beiden Zuweisungsoperator-Überladungen wird verwendet, und es wird keine Ausgabe angezeigt; Daher wird der Standardkopiezuweisungsoperator aufgerufen. Warum wird bei der Zuweisung von d
zu c
der überladene Zuweisungsoperator const nicht verwendet? Oder stattdessen, warum verwendet die Zuweisung von b
zu a
nicht den Standardkopiezuweisungsoperator?
Warum wird die Zuweisung von
d
zuc
den überladenen Zuweisungsoperator const nicht verwenden?
Der implizit deklarierte Kopierzuweisungsoperator, der wie folgt deklariert ist, wird noch erzeugt:
%Vor% Eine Operatorvorlage unterdrückt nicht die Generierung des implizit deklarierten Kopierzuweisungsoperators. Da das Argument (eine Konst-qualifizierte Wrapper
) eine exakte Übereinstimmung für den Parameter dieses Operators ( const Wrapper&
) ist, wird es während der Überladungsauflösung ausgewählt.
Die Operatorvorlage ist nicht ausgewählt und es gibt keine Mehrdeutigkeit, da - bei sonst gleichen Bedingungen - eine Nichtvorlage bei der Überladungsauflösung besser übereinstimmt als eine Vorlage.
Warum verwendet die Zuweisung von
b
zua
nicht den Standardkopiezuweisungsoperator?
Das Argument (eine nicht-konsistente Wrapper
) passt besser zur Operatorvorlage, die ein Wrapper<U>&
als für den implizit deklarierten Kopierzuweisungsoperator verwendet (was ein const Wrapper<U>&
annimmt.
Aus dem C ++ 03 Standard, §12.8 / 9:
Ein vom Benutzer deklarierter Kopierzuweisungsoperator
X::operator=
ist eine nicht statische Nicht-Template Memberfunktion der KlasseX
mit genau einem Parameter vom TypX
,X&
,const X&
,volatile X&
oderconst volatile X&
.
Und §12.8 / 10:
Wenn die Klassendefinition keinen Kopierzuweisungsoperator explizit deklariert, wird einer implizit deklariert.
Die Tatsache, dass Ihre operator=
eine Vorlage ist, macht sie zu einem Kopierzuweisungsoperator nicht . Daher wird der implizite Kopierzuweisungsoperator der Klasse immer noch vom Compiler generiert.
Tags und Links c++ templates assignment-operator