8

Modifica: Entrambi {{1, 2}} e ({1, 2}) funzionano in g ++, né funzionano in clang. C'è una soluzione alternativa per clang?Inizializzazione uniforme di una struttura atomica?

+1

Non vedo alcun trucco; non si può nemmeno più tardi assegnare manualmente una S a quella bestia. Ma pensiamo positivo: non è "solo" dallo standard ma manifestamente sicuro per i thread in questo modo ...;) – Solkar

risposta

5

Questo è clang bug 18097. Here's un thread lungo che discute il problema, che sembra essere che clang supporta solo i tipi scalari per T in atomic<T>. Lo standard C++ 11 afferma chiaramente (§ 29.5/1) che T può essere qualsiasi tipo banalmente copiabile.

Entrambi gli usi di cui in questione devono corrispondere questo costruttore

constexpr atomic(T) noexcept; 

L'unico modo che posso pensare di lavorare attorno a questo è per difetto costruire atomic<S> e quindi utilizzare atomic::store per inizializzare l'oggetto.

std::atomic<S> asd; 
asd.store({1,2}); 
0

std::atomic<S> asd({1, 2});

std::atomic<S> ha un costruttore che prende un valore di tipo S. La lista di inizializzazione {1, 2} è implicitamente convertito in un S temporanea a causa di questo costruttore.

+2

@axnsan Puoi spiegare perché l'inizializzazione uniforme non funziona? Dovrebbe funzionare secondo me. – vsoftco

+0

questo non si compila anche su 'clang ++'. Entrambe le versioni però compile su 'g ++' – vsoftco

+0

@vsoftco Ya, questo è il problema che sto avendo ... usando clang. C'è una soluzione? – David