Рассматривать:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
Содержимое foo теперь действительно? Или мне нужно явно выполнить цикл и инициализировать их? Я проверил на Godbolt, и, кажется, все в порядке, однако стандарт кажется очень запутанным в этом вопросе.
Конструктор std :: vector говорит, что он вставляет вставленные по умолчанию экземпляры std::atomic<int>
, которые являются значением, инициализированным посредством размещения new
.
Я думаю, что этот эффект инициализации значения применяется:
2) если T является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект инициализируется нулями, а затем инициализируется по умолчанию, если у него есть нетривиальный конструктор по умолчанию;
Так что мне кажется, что атомика инициализируется нулями. Таким образом, вопрос заключается в том, имеет ли нулевая инициализация std::atomic<int>
результата в допустимом объекте?
Я собираюсь догадаться, что ответ "да на практике, но это не совсем определено"?
Примечание. Этот ответ согласен с тем, что инициализируется нулем, но в действительности не говорит, означает ли это, что объект допустим.
atomic_init
. В любом случае, вы уже должны синхронизироваться вокруг кода, о котором идет речь