Considerar:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
O conteúdo de foo agora é válido? Ou preciso fazer um loop explicito e inicializá-los? Eu verifiquei Godbolt e parece bom, no entanto, o padrão parece estar muito confuso neste ponto.
O construtor std :: vector diz que insere instâncias inseridas por padrão de std::atomic<int>
, cujo valor é inicializado via veiculação new
.
Eu acho que esse efeito de inicialização de valor se aplica:
2) se T é um tipo de classe com um construtor padrão que não é fornecido nem excluído pelo usuário (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou com padrão), o objeto é inicializado com zero e, em seguida, é inicializado por padrão se tiver um construtor padrão não trivial;
Portanto, parece-me que os átomos são zero-inicializados. Portanto, a questão é: a inicialização zero de um std::atomic<int>
resultado em um objeto válido?
Vou adivinhar que a resposta é "sim na prática, mas não está realmente definida"?
Nota: Esta resposta concorda que foi inicializada com zero, mas não diz se isso significa que o objeto é válido.
atomic_init
. Você já tem para sincronizar em torno do código em questão de qualquer maneira