Ist 'X x = x = X ();' legales C ++?

7

Ich habe das reduziert:

%Vor%

zu folgendem:

%Vor%

Scheint mir legal. Ich verstehe nicht, warum du es machen willst, aber ist es legal? Gibt es Fälle, in denen Sie dies tun möchten (nicht der Fall int , ich realisiere, dass das völlig nutzlos ist)?

    
Luchian Grigore 26.03.2012, 08:36
quelle

4 Antworten

17

Es kommt darauf an, wie Sie "legal" definieren. Es wird kompilieren ; das bedeutet nicht, dass es garantiert funktioniert.

Bis die vollständige Anweisung X x = ... ausgeführt wird, ist x nicht initialisiert. Es ist noch kein X . Daher bedeutet das Ausführen von x = X() das Erstellen eines temporären X und das Aufrufen von X::operator=(const X&) für die nicht initialisierte Variable x .

Aufruf einer Funktion auf einer nicht POD-Klasse Instanz, die nicht initialisiert wurde (der Konstruktor wurde noch nicht aufgerufen), führt zu undefiniertem Verhalten. Wenn X ein POD-Typ (oder trivial in C ++ 11) ist, dann wird es funktionieren. Aber sonst nicht.

    
Nicol Bolas 26.03.2012, 08:46
quelle
10

Es ist syntaktisch zulässig, führt jedoch zur Laufzeit zu undefiniertem Verhalten. In einer Aussage wie:

%Vor%

Das zweite = ist eine Zuweisung und es wird einer nicht initialisierten Variablen zugewiesen. (Das erste = ist einfach die Syntax, um zu sagen, dass das Folgende für die Kopierinitialisierung verwendet werden sollte; es ist keine Zuweisung.)

    
James Kanze 26.03.2012 08:46
quelle
1

Es ist eine legale Syntax. X ist im Bereich für seine eigene Definition. Eine Situation, in der Sie möchten, dass ein Objekt auf sich selbst verweist, sind kreisförmige verknüpfte Listen, die folgendermaßen aussehen:

%Vor%

Diese leere Liste besteht aus einem Dummy-Knoten, der eine Verbindung zu sich selbst hat. Dies ist sowohl klar als auch nützlich. Beachten Sie, dass wir die Adresse leer annehmen, was auch dann zulässig ist, wenn der Knoten ein Nicht-POD ist und noch nicht konstruiert wurde. Ich denke nicht, dass die Zuweisung wie in deinem int m = m = 3; -Beispiel direkt nützlich ist, aber es ist schwer für die Sprache, meine zuzulassen und nicht auch deine zu erlauben.

Um zu sehen, wie dies auf Memberkonstruktoren übertragen wird, sollten Sie folgendes beachten:

%Vor%

Sobald der Name im Geltungsbereich ist, wird auch die Zuweisung zu und von ihm möglich.

    
Brangdon 23.07.2012 13:21
quelle
0
%Vor%

das ist legal (wenn Sie eine Struktur definieren, die den Namen X hat, aber Ihre Struktur den Namen A hat, brauchen Sie auch keine Struktur mit C ++ zu schreiben), aber beides ist undefiniertes Verhalten.

x(x = new int()) ist legal, hat aber auch undefiniertes Verhalten.

    
Pillum 26.03.2012 08:53
quelle

Tags und Links