web-dev-qa-db-ja.com

静的アトミックメンバー変数を初期化する

orderという名前のクラスの識別子をスレッドセーフな方法で生成したいと思います。以下のコードはコンパイルされません。アトミック型にはコピーコンストラクターがないことを知っており、このコードが機能しない理由を説明していると思います。このコードを実際に動作させる方法を知っている人はいますか?私はまだ学んでいるので、間違った方向に進んでいるかどうかも教えてください(もしそうなら、別のアプローチを教えていただければ幸いです)。ありがとう!

#include <atomic>
#include <iostream>

class order {
public: 
    order() { id=c.fetch_add(1); }
    int id;
private:
    static std::atomic<int> c;
};

std::atomic<int> order::c = std::atomic<int>(0);

int main() {
    order *o1 = new order();
    order *o2 = new order();
    std::cout << o1->id << std::endl; // Expect 0
    std::cout << o2->id << std::endl; // Expect 1
}

上記をコンパイルすると、次のエラーが発生します。

order.cpp:45:51: error: use of deleted function 
        ‘std::atomic<int>::atomic(const std::atomic<int>&)’
In file included from order.cpp:3:0:
/usr/include/c++/4.7/atomic:594:7: error: declared here
23
Teisman

アトミック型にはコピーコンストラクターがないことを知っており、このコードが機能しない理由を説明していると思います。

はい、エラーは非常に明確にそれを言います。

このコードを実際に動作させる方法を知っている人はいますか?

アクセス可能なコピーコンストラクタを必要とするテンポラリからのコピー初期化の代わりに:

std::atomic<int> order::c = std::atomic<int>(0);

以下を行わない直接初期化を使用します。

std::atomic<int> order::c(0);   // or {0} for a more C++11 experience

不必要に冗長なコードを読むのを楽しんでいない限り、とにかくそれを好むはずです。

44
Mike Seymour

定義はどうですか

std::atomic<int> order::c{0}
25

また、atomic_init

std::atomic<int> data;
std::atomic_init(&data, 0);
3
anhldbk