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?
risposta
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});
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.
@axnsan Puoi spiegare perché l'inizializzazione uniforme non funziona? Dovrebbe funzionare secondo me. – vsoftco
questo non si compila anche su 'clang ++'. Entrambe le versioni però compile su 'g ++' – vsoftco
@vsoftco Ya, questo è il problema che sto avendo ... usando clang. C'è una soluzione? – David
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