8
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 の回避策はありますか?

4

2 に答える 2

5

これは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});
于 2014-07-22T17:13:07.413 に答える
0

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

std::atomic<S>には S 型の値を取るコンストラクタがあります。初期化子リスト {1, 2} は、このコンストラクタのために暗黙的に一時的な S に変換されます。

于 2014-07-22T15:25:12.477 に答える