Поміркуйте:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
Чи вміст foo зараз дійсний? Або мені потрібно явно прокрутити і ініціалізувати їх? Я перевірив Godbolt, і це здається прекрасним, проте стандарт здається дуже заплутаним у цьому питанні.
Конструктор std :: vector говорить, що він вставляє вставлені за замовчуванням екземпляри std::atomic<int>
, які значення ініціалізуються через розміщення new
.
Я думаю, що цей ефект ініціалізації значення застосовується:
2) якщо T - тип класу з конструктором за замовчуванням, який не надається користувачем, ані видаляється (тобто це може бути клас із неявно визначеним або дефолтним конструктором за замовчуванням), об'єкт ініціалізується нулем і тоді він ініціалізовано за замовчуванням, якщо він має нетривіальний конструктор за замовчуванням;
Тож мені здається, що атома нульова ініціалізація. Отже, питання полягає в тому, чи нульова ініціалізація astd::atomic<int>
результату у дійсному об'єкті?
Я буду здогадуватися, що відповідь "так на практиці, але насправді це не визначено"?
Примітка. Ця відповідь погоджується з тим, що вона нульова ініціалізована, але насправді не говорить, якщо це означає, що об'єкт дійсний.
atomic_init
. Вам вже доведеться синхронізувати навколо коду у питанні