Die Kopierinitialisierung in C ++ im Vergleich zur expliziten Initialisierung

8

Warum wird die erste kommentierte Zeile korrekt kompiliert, während die zweite nicht?

Warum kann a sich selbst als Konstruktorargument angeben, aber b kann nicht?
Tun die beiden nicht dasselbe?

%Vor%

Aktualisieren

Da es scheint, dass es compilerabhängig ist, scheint es, dass das Problem schwerwiegender ist, als ich dachte.
Also ich denke ein anderer Teil der Frage ist, ist der folgende Code gültig oder nicht?

Es gibt einen Fehler in GCC, aber Visual C ++ führt es einfach aus.

%Vor%     
Mehrdad 01.02.2013, 05:47
quelle

2 Antworten

4

In Ihrem ersten Code sollten beide Deklarationen kompilieren. GCC ist genau dort. Visual C ++ - Compiler hat einen Fehler.

Und im zweiten Code sollte die innere Deklaration nicht kompilieren. GCC ist auch da und VC ++ ist falsch.

GCC ist in beiden Fällen richtig .

Ein Code wie int a=a+100; und int a(a+100); ist aus Sicht Syntax in Ordnung. Sie können ein undefiniertes Verhalten auslösen, je nachdem, ob sie in statischer Speicherdauer oder automatischer Speicherdauer erstellt wurden.

%Vor%

Bitte lesen Sie die Kommentare zu den oben genannten Erklärungen.

Beachten Sie, dass Variablen mit statischer Speicherdauer zur Kompilierzeit statisch auf Null initialisiert werden, und wenn sie Initialisierer haben, werden sie zur Laufzeit auch auch initialisiert. Variablen von POD-Typen mit automatischer Speicherdauer werden jedoch nicht statisch initialisiert.

Weitere Informationen zur statischen Initialisierung und dynamischen Initialisierung finden Sie in folgendem Abschnitt:

Nawaz 01.02.2013, 05:54
quelle
1

In Ihrem ersten Beispiel ist das Verhalten nicht definiert, obwohl die Syntax in Ordnung ist. Ein Compiler darf daher den Code ablehnen (das undefinierte Verhalten muss jedoch garantiert sein; es ist hier, aber es wäre nicht, wenn die ungültigen Initialisierungen niemals tatsächlich ausgeführt würden).

Ihr zweites Beispiel hat einen Typfehler: Eine Deklaration ist sichtbar, sobald ihr Deklarator angezeigt wird, und sie ist insbesondere in ihrem eigenen Initialisierer sichtbar. MSVC ++ verzögert die Sichtbarkeit: Dies ist ein bekanntes Nicht-Konformitäts-Problem in diesem Compiler. Z. B. mit dem EDG-Compiler (der einen Microsoft-Modus hat):

%Vor%     
user1056575 01.02.2013 15:01
quelle

Tags und Links