Warum verursachen Referenztyp-Member, dass implizit deklarierter Kopierzuweisungsoperator gelöscht wird

8

Von CPP-Referenz:

Gelöschter implizit deklarierter Kopierzuweisungsoperator Der implizit deklarierte oder vorbelegte Kopierzuweisungsoperator für die Klasse T wird als gelöscht definiert, wenn eine der folgenden Bedingungen zutrifft:

%Vor%

Das sagt mir also, was die Löschung verursacht, aber nicht warum? Kann jemand erklären für:

%Vor%

und ob dies in meiner Klasse ausreicht, um mit dem gelöschten Operator umzugehen:

%Vor%

wenn ich ein Mitglied einer Basisklasse habe, die ein Referenztyp ist.

Muss ich irgendetwas in meinem operator= tun, wie zum Beispiel deklariere return *this oder behandelt der Compiler (g ++) das für mich? Muss ich etwas Besonderes mit dem Referenzmitglied machen? Sorry für noob Frage, aber ich bin neu in C ++ mit verwalteten Sprachen (C # und Java) gestartet.

    
Luthervd 15.11.2014, 13:13
quelle

2 Antworten

10

Referenzen sind an ein Objekt gebunden, wenn sie initialisiert werden und danach nicht mehr geändert werden können. Alles andere, was Sie mit ihnen tun, beeinflusst das Objekt, an das sie gebunden sind, nicht die Referenz selbst.

So wird ein Referenzelement während der Konstruktion festgelegt und nie verändert. Da der Zweck eines Zuweisungsoperators darin besteht, Mitglieder nach der Konstruktion zu ändern, macht es keinen Sinn, einen impliziten Zuweisungsoperator zu erzeugen, wenn eines der Mitglieder niemals geändert werden kann. Der Compiler weigert sich zu versuchen, zu erraten, was er tun soll, und zwingt Sie, Ihren eigenen Zuweisungsoperator mit der gewünschten Semantik zu versehen.

  

Muss ich irgendetwas in meinem Operator tun = wie explizit deklarieren return * dies oder wird der Compiler (g ++) dies für mich behandeln?

Sie müssen unbedingt 100% return *this;

Die einzige Zeit, die Sie keine explizite Rückgabe in C ++ benötigen, ist, wenn Ihre Funktion void oder in main() (wo ein implizites return 0; ist, wenn Sie das Ende der Funktion erreichen) oder in unusual zurückgibt Fälle wie Funktionen, die nie zurückkehren (entweder für immer oder für eine Ausnahme).

  

Muss ich etwas Besonderes mit dem Referenzmitglied machen?

Es hängt davon ab, welche Semantik Sie für die Zuweisung Ihres Typs erwarten.

Wenn Sie nicht möchten, dass das Objekt, an das die Referenz gebunden ist, geändert wird, tun Sie nichts damit.

Wenn Sie möchten, dass die Zuweisung das Objekt ändert, an das die Referenz gebunden ist, müssen Sie das tun.

Wenn Sie möchten, dass die Referenz an ein anderes Objekt gebunden wird, haben Sie kein Glück, C ++ lässt das nicht zu.

    
Jonathan Wakely 15.11.2014, 13:21
quelle
5

Eine Referenz kann nicht geändert werden. Das von der Referenz referenzierte Objekt kann geändert werden, aber die Referenz selbst kann nicht.

Betrachten Sie

%Vor%

Es gibt nothing , das Sie möglicherweise in einer benutzerdefinierten operator= -Implementierung verwenden können, die a1.r auf j verweist, und deshalb wird operator= nicht erstellt oder sollte erstellt werden Ihr Interesse.

Wenn Sie eine Situation haben, in der es für operator= in Ordnung ist, diese Referenz nicht zu ändern, können Sie Ihre eigenen definieren.

Wenn Sie eine Situation haben, in der % % benötigt wird, um eine Referenz zu ändern, sollte Ihre Klasse keine Referenz verwenden. Ein Zeiger könnte geeigneter sein.

    
hvd 15.11.2014 13:19
quelle

Tags und Links