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
アトミック型にはコピーコンストラクターがないことを知っており、このコードが機能しない理由を説明していると思います。
はい、エラーは非常に明確にそれを言います。
このコードを実際に動作させる方法を知っている人はいますか?
アクセス可能なコピーコンストラクタを必要とするテンポラリからのコピー初期化の代わりに:
std::atomic<int> order::c = std::atomic<int>(0);
以下を行わない直接初期化を使用します。
std::atomic<int> order::c(0); // or {0} for a more C++11 experience
不必要に冗長なコードを読むのを楽しんでいない限り、とにかくそれを好むはずです。
定義はどうですか
std::atomic<int> order::c{0}
また、atomic_init
:
std::atomic<int> data;
std::atomic_init(&data, 0);