我想为名为的类生成标识符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
无论如何,您可能应该更喜欢这样做,除非您喜欢阅读不必要的冗长代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)