Düşünmek:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
Foo'nun içeriği artık geçerli mi? Yoksa açık bir şekilde döngü yapmam ve bunları başlatmam gerekir mi? Godbolt üzerinde kontrol ettik ve iyi görünüyor, ancak standart bu noktada çok karışık gibi görünüyor.
Std :: vector yapıcı o ekler diyor varsayılan eklenen örneklerini std::atomic<int>
vardır başlatıldı değer yerleşimi yoluyla new
.
Değer başlatmanın bu etkisinin geçerli olduğunu düşünüyorum:
2) T, kullanıcı tarafından sağlanan veya silinmeyen varsayılan bir kurucuya sahip bir sınıf türüyse (yani, örtülü olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne sıfırla başlatılır ve sonra önemsiz olmayan bir varsayılan kurucu varsa varsayılan olarak başlatılmış;
Bana öyle geliyor ki atomlar sıfır başlatıldı. Yani soru şu ki, bir std::atomic<int>
sonucun sıfır başlatılması geçerli bir nesnede mi?
Cevabın "pratikte evet ama gerçekten tanımlanmamış" olduğunu tahmin edeceğim.
Not: Bu yanıt sıfır olarak başlatıldığını kabul eder, ancak bunun nesnenin geçerli olduğu anlamına gelip gelmediğini söylemez.
atomic_init
. Zaten sorudaki kod etrafında senkronize etmek zorundasınız