编译DGSF-AvA项目时遭遇std::atomic已删除拷贝构造函数错误
解决方案:修复std::atomic拷贝构造函数删除的编译错误
错误根源
你遇到的编译错误并非来自atomic变量的初始化,而是在printf调用中直接传递std::atomic<uint32_t>对象导致的:
printf("not my turn: me %u turn %u\n", current_id, current_turn);
std::atomic的拷贝构造函数被显式删除(deleted function),而printf的可变参数列表会尝试对传入的current_turn执行拷贝操作,从而触发编译报错。
修复代码
将printf中的current_turn替换为原子变量的load()方法调用,获取其当前值:
printf("not my turn: me %u turn %u\n", current_id, current_turn.load());
如果不需要严格的内存顺序保证,可指定更轻量的内存序提升性能:
printf("not my turn: me %u turn %u\n", current_id, current_turn.load(std::memory_order_relaxed));
补充说明
- 你尝试的几种
current_turn初始化方式((0)、{0}、={0})在C++14标准下均合法,这不是问题所在。 std::atomic<uint32_t>和std::atomic_int的拷贝行为一致,均不允许拷贝构造,因此错误与原子变量的具体类型无关。
内容的提问来源于stack exchange,提问作者Abhishek Ghosh
相关产品推荐
相关产品推荐

