Che cosa significa 0-inizializzazione della variabile std::atomic<integral_type>
?0-initialization of atomics è garantito per impostare il valore member su 0?
Origini della domanda. Ho una funzione statica std::array
di std::atomic<std::int>
, che voglio essere impostata a 0 prima del primo utilizzo (è ovvio che la funzione in cui risiede l'array è chiamata in modo imprevedibile da più thread).
Questo pezzo di codice è di bell'aspetto, ma non la compilazione a causa di Atomics essere non-copia costruibile:
#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};
Ora, capisco che statica std::array
sta per 0-inizializzare tutte è membri e std::atomic<>
sta per essere inizializzato 0. Ma abbiamo una garanzia esplicita o implicita che imposterà tutti i valori a? Il buon senso dice "sì" - dopotutto, supponiamo che la classe abbia un membro di tipo int
e questo membro sia inizializzato a 0. Ma questa supposizione è basata su solidi motivi di standard?
Interessante. Questo produce l'errore in [GCC] (http://coliru.stacked-crooked.com/a/467922a19099c9a7) e [Clang] (http://coliru.stacked-crooked.com/a/3c8e5cba2847b829), ma non con MSVC++. Un effetto collaterale forse di [copia elision] (http://en.cppreference.com/w/cpp/language/copy_elision)? – wally
@flatmouse MSVC è bacato, come tutti sappiamo :) – SergeyA
Penso che tu voglia dire pieno di 'caratteristiche' extra e non documentate :) – wally