Prendere in considerazione:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
I contenuti di foo sono ora validi? O devo ripetere esplicitamente e inizializzarli? Ho controllato Godbolt e sembra che vada bene, tuttavia lo standard sembra essere molto confuso su questo punto.
Il costruttore std :: vector afferma di inserire istanze di default inseritestd::atomic<int>
, che sono valori inizializzati tramite posizionamento new
.
Penso che si applichi questo effetto di inizializzazione del valore:
2) se T è un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né eliminato (ovvero, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto viene inizializzato con zero e quindi è default-inizializzato se ha un costruttore predefinito non banale;
Quindi mi sembra che gli atomici siano a zero inizializzati. Quindi la domanda è: l'inizializzazione zero di un std::atomic<int>
risultato in un oggetto valido?
Ho intenzione di indovinare che la risposta è "sì, in pratica, ma non è davvero definita"?
Nota: questa risposta concorda sul fatto che è inizializzata a zero, ma in realtà non dice se ciò significa che l'oggetto è valido.
atomic_init
. Devi già sincronizzare il codice nella domanda comunque