Template-Überweisungsoperator, der Mystery überlädt

7

Ich habe eine einfache Struktur Wrapper , die sich durch zwei Überladungen des zugewiesenen Zuweisungsoperators unterscheidet:

%Vor%

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,

%Vor%

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?

    
user2023370 11.04.2011, 18:32
quelle

2 Antworten

18
  

Warum wird die Zuweisung von d zu c 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 zu a 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.

    
James McNellis 11.04.2011, 18:36
quelle
6

Aus dem C ++ 03 Standard, §12.8 / 9:

  

Ein vom Benutzer deklarierter Kopierzuweisungsoperator X::operator= ist eine nicht statische Nicht-Template Memberfunktion der Klasse X mit genau einem Parameter vom Typ X , X& , const X& , volatile X& oder const 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.

    
ildjarn 11.04.2011 18:41
quelle