Trovo che in pratica, con una varietà di compilatori C++ 11/C++ 14, un std::atomic
ha un valore iniziale indefinito proprio come sarebbe se fosse un tipo "raw". Cioè, ci aspettiamo che per l'espressioneQual è il valore predefinito per std :: atomic?
int a;
a
può avere alcun valore. Risulta anche essere vero che per l'espressione
std::atomic<int> b;
b
può anche avere qualsiasi valore. Per dirla in un altro modo,
std::atomic<int> b; // b is undefined
non è equivalente a
std::atomic<int> b{ 0 }; // b == 0
o
std::atomic<int> b{}; // b == 0
perché in questi ultimi due casi b
viene inizializzato ad un valore noto.
La mia domanda è semplice: dove nella specifica C++ 11 o C++ 14 questo comportamento è documentato?
Essendo non inizializzato è in realtà abbastanza importante qui. Considera cosa succede se metti mmap un blocco di memoria condivisa da un file di database in cui stai usando atomics per bloccare ogni nodo BTree mentre discendi la struttura ad albero. Certamente non vuoi che il tuo codice imposti i valori a zero quando apri il file. –