struct S
{
int x;
int y;
};
std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work
編集: どちらもg++{{1, 2}}
で({1, 2})
動作し、clang では動作しません。clang の回避策はありますか?
struct S
{
int x;
int y;
};
std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work
編集: どちらもg++{{1, 2}}
で({1, 2})
動作し、clang では動作しません。clang の回避策はありますか?
これはclang bug 18097です。これは、この問題について議論している長いスレッドです。これは、clang が in のスカラー型のみをサポートしているようT
ですatomic<T>
。C++11 標準では (§29.5/1)、T
自明にコピー可能な任意の型にすることができると明確に述べています。
質問に示されている両方の使用法は、このコンストラクターと一致する必要があります
constexpr atomic(T) noexcept;
これを回避する唯一の方法は、デフォルト コンストラクトatomic<S>
を使用atomic::store
してオブジェクトを初期化することです。
std::atomic<S> asd;
asd.store({1,2});
std::atomic<S> asd({1, 2});
std::atomic<S>
には S 型の値を取るコンストラクタがあります。初期化子リスト {1, 2} は、このコンストラクタのために暗黙的に一時的な S に変換されます。