Erwägen:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
Sind die Inhalte von foo jetzt gültig? Oder muss ich sie explizit durchlaufen und initialisieren? Ich habe Godbolt überprüft und es scheint in Ordnung zu sein, jedoch scheint der Standard in diesem Punkt sehr verwirrt zu sein.
Der Konstruktor std :: vector gibt an, dass standardmäßig eingefügte Instanzen von eingefügt werden std::atomic<int>
, deren Wert über die Platzierung initialisiert wird new
.
Ich denke, dieser Effekt der Wertinitialisierung gilt:
2) Wenn T ein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (dh es kann sich um eine Klasse mit einem implizit definierten oder standardmäßigen Standardkonstruktor handeln), wird das Objekt mit Null initialisiert und ist es dann Standardinitialisiert, wenn es einen nicht trivialen Standardkonstruktor hat;
Es scheint mir also, dass die Atomics auf Null initialisiert sind. Die Frage ist also, ob die Nullinitialisierung eines std::atomic<int>
Ergebnisses zu einem gültigen Objekt führt.
Ich werde vermuten, dass die Antwort "Ja in der Praxis, aber es ist nicht wirklich definiert" ist?
Hinweis: Diese Antwort stimmt zu, dass sie mit Null initialisiert ist, sagt jedoch nicht wirklich aus, ob dies bedeutet, dass das Objekt gültig ist.
atomic_init
. Sie müssen ohnehin schon um den Code in der Frage synchronisieren