Was ist der default-Wert für ein std::atomic?
Finde ich, dass in der Praxis mit einer Vielzahl von C++11/C++14-Compiler, ein std::atomic
hat einen undefinierten Anfangswert nur, wie es wäre, wenn es ein "raw" - Typ. Das heißt, wir erwarten, dass für die expression
int a;
a
kann einen beliebigen Wert haben. Es stellt sich auch heraus, um wahr zu sein, dass für den Ausdruck
std::atomic< int > b;
b
können auch einen beliebigen Wert haben. Zu sagen, dass es einen anderen Weg,
std::atomic< int > b; //b is undefined
ist nicht äquivalent zu
std::atomic< int > b{ 0 }; //b == 0
oder
std::atomic< int > b{}; //b == 0
weil in den letzten beiden Fällen b
initialisiert wird auf einen bekannten Wert.
Meine Frage ist einfach: wo in der C++11 oder C++14-spec ist dieses Verhalten dokumentiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
[atomics.Typen.generic]/5, sagt dieses über Integrale Spezialisierungen:
Darüber hinaus die primäre Vorlage übersicht am Anfang der gleiche Abschnitt normativ definiert die Standard-Konstruktor wie:
Die Effekte sind definiert in [atomic.Typen.Operationen]/4:
§ 29.6.5 [atomics.Typen.Operationen.req] ¶ 4 N 4140 (der endgültige Entwurf für C++14) sagt:
Beachten Sie, dass dies nicht bedeutet, dass das Objekt umschließt einen unbestimmten Wert, den Sie Lesen können, aber nicht abhängig von dessen Wert. Es bedeutet vielmehr, dass das Lesen den Wert aus dem Objekt vor dem zuweisen, um es führt zu undefiniertem Verhalten.