Array Initialisierung, referenziert ein vorheriges Element ok?

8
%Vor%

Während dies mit dem MS Visual Studio Compiler kompiliert wird, bin ich nicht sicher, ob dies ein gültiger Code gemäß dem C ++ Standard ist.

Zitate aus dem Standard würden sehr geschätzt.

    
smerlin 06.11.2010, 19:30
quelle

4 Antworten

2

C ++ 03 / C ++ 11 Antwort

Nein, ist es nicht.

Auf der rechten Seite von = , points existiert 1 aber der Initialisierer wird erst angewendet, nachdem alle seine Operanden ausgewertet wurden.

  • Wenn points im Namespace-Bereich ist (und somit statische Speicherdauer hat und auf Null initialisiert wurde 2 ), dann ist dies "sicher", aber Ihre Verwendung von points[0] es wird dir 0 geben, anstatt QPointF(r.left() - i, r.top() - i) wieder.

  • Wenn points eine automatische Speicherdauer hat - es wurde noch nicht initialisiert, so versucht Ihre Verwendung von points[0] eine nicht initialisierte Variable zu verwenden, wobei points[0] einen unbestimmten Wert hat ... was schlecht ist 3 .

Es ist schwierig, dafür Standardreferenzen bereitzustellen, außer zu sagen, dass es nichts in 8.5 "Initializers" gibt, das dies explizit ermöglicht, und andere Regeln füllen den Rest aus.

  

1 [n3290: 3.3.2/1]: Der Deklarationspunkt für einen Namen ist unmittelbar nach seinem vollständigen Deklarator (Abschnitt 8) und vor seinem Initialisierer (falls vorhanden), außer wie angegeben unten. [ Beispiel:

%Vor%      

Hier wird der zweite x mit seinem eigenen (unbestimmt) Wert initialisiert. -Endbeispiel ]

     

2 [n3290: 3.6.2/2]: Variablen mit statischer Speicherdauer (3.7.1) oder Thread-Speicherdauer (3.7.2) sollen initialisiert werden (8.5)   bevor irgendeine andere Initialisierung stattfindet. [..]

     

3 [n3290: 17.6.3.3/2]: [..] [ Hinweis: Operationen   unbestimmte Werte können zu undefiniertem Verhalten führen. -Endnote ]

    
Lightness Races in Orbit 11.09.2011, 13:55
quelle
2

von Ссылка :

%Vor%     
Anycorn 06.11.2010 19:39
quelle
0

Da in der Anweisung kein Sequenzpunkt vorhanden ist, ist das Ergebnis undefiniert, ähnlich wie für das Beispiel i=i++ zitiert auf dieser Wikipedia-Seite.

Ansonsten sagt nichts, ob der Compiler zuerst alles auswerten, dann zuweisen oder für jedes Element separat und in welcher Reihenfolge auswerten soll.

    
eudoxos 11.09.2011 14:55
quelle
-2

Alte Antwort (verfehlt den Punkt):

Ich habe den aktuellen C ++ 0x-Entwurf überprüft und dort den Satz 8.5.1.17 gefunden, der besagt:

  

17 Die vollständigen Ausdrücke in einem    initializer-Klausel wird in ausgewertet   die Reihenfolge, in der sie erscheinen.

Obwohl dieser Satz nicht Teil des C ++ Standards von 2003 ist, bin ich mir ziemlich sicher, dass dies in jedem aktuellen Compiler funktionieren sollte, wenn dieser Teil von C ++ 0x ist.

Bearbeiten:
Die Kommentare haben mich dazu gebracht, diese Angelegenheit zu überdenken. Diese Zeile stellt nur sicher, dass die Objekte QPointF in der Reihenfolge erstellt werden, in der sie bei der Array-Initialisierung auftreten (relevant, wenn die Elementkonstruktoren beobachtbare Nebenwirkungen haben). Das Problem ist, dass der Wert von points während seiner Array-Initialisierung unbestimmt ist. Es kann also auch keine Garantie für einen gültigen Wert von points[0] geben, zumindest nicht, wenn Sie sich auf den Standard verlassen.

    
smerlin 12.11.2010 00:38
quelle