C++ 错误:使用已删除的函数‘;标准::原子<_Tp>;::原子();

C++ 错误:使用已删除的函数‘;标准::原子<_Tp>;::原子();,c++,atomic,compare-and-swap,C++,Atomic,Compare And Swap,使用基于类的原子时存在编译问题 错误:使用已删除的函数“std::atomic::atomic()[with _Tp=node]” 堆栈(){ ^ /usr/include/c++/5/atomic:185:7:注意:“std::atomic::atomic()noexcept[with _Tp=node]”被隐式删除,因为其异常规范与隐式异常规范“”不匹配 原子()noexcept=默认值; ^ #包括 #包括 #包括 类节点 { 私人: int数据; 布尔哈斯交易; 公众: 节点(int&d

使用基于类的原子时存在编译问题

错误:使用已删除的函数“std::atomic::atomic()[with _Tp=node]” 堆栈(){ ^

/usr/include/c++/5/atomic:185:7:注意:“std::atomic::atomic()noexcept[with _Tp=node]”被隐式删除,因为其异常规范与隐式异常规范“”不匹配 原子()noexcept=默认值; ^

#包括
#包括
#包括
类节点
{
私人:
int数据;
布尔哈斯交易;
公众:
节点(int&data):数据(data),hasTransaction(true){}
node():数据(10),hasTransaction(true){}
};
类堆栈{
原子头;
公众:
无效推送(整型数据){
节点新建_节点(数据);
节点电流=头部负载(标准::内存\u顺序\u松弛);
而(!head.compare\u exchange\u strong(
现在的
新节点,
std::内存\u顺序\u释放,
std::内存(顺序)
;
}
堆栈(){
节点a;
std::原子_init(&head,a);
总库(a);
};
};
int main()
{
堆栈s;
s、 推(1);
s、 推(2);
s、 推(3);
}

这是因为您的
节点的默认构造函数未标记为
noexcept
std::atomic
默认构造函数标记为noexcept,因此
T
的默认构造函数也必须是

应改为:

node()noexcept:data(10),hasTransaction(true){
然而,您可能应该知道,除非您的类型是琐碎的,否则这种“原子”类型很可能会通过互斥使线程安全。因此,在这种情况下使用原子只会让您的生活变得更加艰难而毫无益处


通常情况下,您不想使用原子,除非它用于某些基本类型(通常是原始指针或整数类型)。

这意味着我应该将原子与类型atomic?一起使用,而不是使用atomic?@Oktaheta我这样说:类型越复杂(类型越大),它在硬件级别实际使用原子操作的可能性就越小。当不使用原子操作时,它需要使用例如互斥来模拟它,这要慢得多。您的
节点
类型只包含int和bool,因此您可以使用
std::atomic
并将高阶位视为
hasTransaction通过按位算术标记。这也会将“节点”的大小从8字节降至4字节。我明白了,这让我明白,我宁愿使用原始指针:)