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