Was bedeutet 0-Initialisierung von std::atomic<integral_type>
Variable bedeuten?Ist die 0-Initialisierung von Atomics garantiert, um den Wert member auf 0 zu setzen?
Ursprünge der Frage. Ich habe eine Funktion-statische von std::atomic<std::int>
, die ich vor der ersten Verwendung auf 0 gesetzt werden soll (versteht sich von selbst, Funktion, wo das Array befindet sich in unvorhersehbarer Weise aus mehreren Threads aufgerufen).
Dieses Stück Code ist gut aussehend, aber nicht beschränkt auf atomics Kompilieren durch sein Nicht-Kopie konstruierbar:
#include <array>
#include <atomic>
void foo() {
using t = std::atomic<int>;
static std::array<t, 2> arr = {0, 0}; // <-- explicit, but errors out (see below)
static std::array<t, 2> arr2; // <-- implicit?, works
}
error: use of deleted function ‘std::atomic::atomic(const std::atomic&)’ std::array arr = {0, 0};
Jetzt verstehe ich, dass statische std::array
zu geht 0-initialisieren alle es ist Mitglieder und std::atomic<>
wird 0-initialisiert. Aber haben wir eine explizite oder implizite Garantie, dass alle Werte auf 0 gesetzt werden? Der gesunde Menschenverstand sagt "Ja" - schließlich nehmen wir an, dass die Klasse ein Mitglied vom Typ int
haben wird, und dieses Mitglied wird 0-initialisiert. Aber basiert diese Annahme auf soliden Standardgrundlagen?
Interessant. Dies erzeugt den Fehler in [GCC] (http://coliru.stacked-crooked.com/a/467922a19099c9a7) und [Clang] (http://coliru.stacked-crooked.com/a/3c8e5cba2847b829), aber nicht mit MSVC++. Ein Nebeneffekt von [Kopie Elision] (http://en.cppreference.com/w/cpp/language/copy_elision)? – wally
@flatmouse MSVC ist fehlerhaft, wie wir alle wissen :) – SergeyA
Ich denke du meinst voll von zusätzlichen und undokumentierten "Funktionen" :) – wally