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 synchronisierenSelbst wenn der Standardkonstruktor aufgerufen wurde (nicht, weil er trivial ist) , macht er eigentlich nichts .
Eine Nullinitialisierung kann offensichtlich nicht garantiert werden, um ein gültiges Atom zu erzeugen. Dies funktioniert nur, wenn zufällig ein gültiges Atom durch Nullinitialisierung aller seiner Mitglieder erstellt wird.
Und da Atomics nicht kopierbar sind, können Sie im Vektorkonstruktor keinen Initialisierungswert angeben.
Sie sollten jetzt den Container und
std::atomic_init
jedes Element durchlaufen. Wenn Sie dies umgehen müssen, ist dies in Ordnung, da Sie die Erstellung des Vektors aus demselben Grund bereits synchronisieren.quelle