这是因为std::atomic
类型的对象不能被复制,即不能使用赋值运算符=
。在while
循环中,head_
被赋值为old_head->next_
,导致编译器尝试调用std::atomic<Node*>::operator=
,从而产生错误。
解决方法是改为使用指针来更新head_
的值,如下所示:
while (Node *const old_head = head_.load())
{
Node *const next = old_head->next_;
if (head_.compare_exchange_weak(old_head, next))
{
delete old_head;
break;
}
}
这里使用了compare_exchange_weak
操作来修改head_
的值,同时删除旧的头结点。注意到compare_exchange_weak
返回的是一个布尔值,表示是否成功修改了head_
的值。如果修改成功,则退出循环;否则继续进行循环,直到修改成功为止。