Ist der Kopier-CTOR erforderlich, auch wenn er nie aufgerufen wird?

8

beachte Folgendes:

%Vor%

Dieser Code erzeugt diese Ausgabe:

%Vor%

Ich dachte, dass alle oben genannten drei Aussagen äquivalent sind, da der CTOR niemals kopiert wird. Ändern Sie jedoch X 's kopieren CTOR, um privat zu sein:

%Vor%

Fehler beim Kompilieren (In Visual Studio 2010) mit diesem Fehler:

%Vor%

So scheint es, die Kopie CTOR ist irgendwie beteiligt, obwohl ich nicht ganz verstehe, wie.

Danke

    
dankilman 10.06.2011, 16:50
quelle

4 Antworten

5
%Vor%

Der Grund ist, dass all diese nicht genau gleichwertig sind.

Die erste ist direkte Initialisierung , während die zweite und dritte Kopierinitialisierung ist. Für die Copy-Initialisierung muss copy-constructor öffentlich sein, andernfalls gibt der Compiler einen Fehler.

Nun ist die Frage, ob 2. und 3. benötigt, dass der copy-ctor public ist, warum dann die folgende Ausgabe:

%Vor%

Das sagt sicher, dass copy-ctor niemals aufgerufen wird, was wahr ist. Der Compiler hat gerade den Aufruf von copy-ctor abgelehnt. Gemäß §8.5 / 14 darf der Compiler in solchen Fällen die Notwendigkeit des Aufrufs des Copy-Konstruktors beseitigen. Deshalb wird copy-ctor nicht aufgerufen.

Etwas innerlich: Im zweiten und dritten Fall wird zuerst ein temporäres Objekt erstellt, indem X(int i) aufgerufen wird. Dieses temporäre Objekt sollte dann an den copy-ctor übergeben werden, um das deklarierte Objekt zu initialisieren. Aber der Compiler optimiert diesen Schritt und trennt den Aufruf von copy-ctor.

    
Nawaz 10.06.2011, 16:52
quelle
3

Das X x2 = ... ruft den Kopierkonstruktor auf (auch wenn der Compiler es später optimiert). Daher muss es immer noch zugänglich sein.

    
Chris Jester-Young 10.06.2011 16:52
quelle
0
  1. Dies:

    X x3 = (X) 1; wird c-style von int in das Objekt vom Typ X

    umgewandelt
  2. Dieses Kopieren:

    X x2 = X (1);

ist zwar optimiert, aber der Compiler benötigt weiterhin den Zugriff auf den Copy-Konstruktor.

    
BЈовић 10.06.2011 16:52
quelle
0

Ist-Objekt verwendet parrametrisierten Konstruktor, wie Sie es kennen, und alle anderen verwenden Kopierkonstruktor. Das heißt, wenn Sie es machen, tritt eine private Zugriffsverletzung auf. Die anderen beiden Objekte verwenden den Kopierkonstruktor.

Dies ist die Art der Verwendung des Kopierkonstruktors.

    
Stuti 10.06.2011 17:09
quelle