8
struct S 
{ 
    int x; 
    int y; 
}; 

std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work 

Edit: Sowohl {{1, 2}} und ({1, 2}) arbeiten in g ++, funktionieren beide nicht in clang. Gibt es einen Workaround für Clang?Einheitliche Initialisierung einer atomaren Struktur?

+1

Ich sehe keinen Hack; man kann dem Biest nicht einmal manuell ein S zuweisen. Aber lassen Sie uns positiv denken - es ist nicht "nur" nach dem Standard, sondern offensichtlich threadsicher auf diese Weise ...;) – Solkar

Antwort

5

Dies ist clang bug 18097. Here's ein langer Thread diskutiert das Problem, das scheint zu sein, dass Clam nur skalare Typen für T in atomic<T> unterstützt. Der C++ 11-Standard besagt eindeutig (§29.5/1), dass T jeder trivial kopierbare Typ sein kann.

Sowohl die in der Frage gezeigt Verwendungen sollten diesen Konstruktor

constexpr atomic(T) noexcept; 

Den einzigen Weg, passen ich arbeitet denken kann, um diese atomic<S> zu bauen auf Standard ist und dann atomic::store, um das Objekt zu initialisieren.

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

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

std::atomic<S> einen Konstruktor hat, die einen Wert vom Typ S. Die Initialisiererliste {1, 2} ist implizit konvertiert in einen temporären S wegen dieses Konstruktor.

+2

@axnsan Können Sie erklären, warum die einheitliche Initialisierung nicht funktioniert? Es sollte meiner Meinung nach funktionieren. – vsoftco

+0

dies kompiliert auch nicht auf 'clang ++'. Beide Versionen kompilieren jedoch auf 'g ++' – vsoftco

+0

@vsoftco Ya, das ist das Problem, das ich habe ... mit Clang. Gibt es eine Problemumgehung? – David