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
%Vor%[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: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 ]
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.
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.
Tags und Links arrays c++ standards initialization