考虑这个简单的代码:
#include <iostream>
#include <atomic>
void add(std::atomic<double> & a, double c)
{
std::atomic_fetch_add(&a, c);
}
int main()
{
std::atomic<double> a;
a.store(0);
std::cout << a.load() << std::endl;
add(a, 5.0);
std::cout << a.load() << std::endl;
std::cin.get();
}
编译它将导致:
错误LNK2019:未解析的外部符号&#34; double __cdecl std :: atomic_fetch_add(struct std :: atomic *,double)&#34;在函数&#34; void __cdecl add(struct std :: atomic&amp;,double)&#34;中引用了(?? $ atomic_fetch_add @ N @ std @@ YANPAU?$ atomic @ N @ 0 @ N @ Z) (?添加@@ YAXAAU?$原子@ N @ @@ STDÑ@ Z)
根据this,atomic_fetch_add
中定义了<atomic>
,所以发生了什么?
答案 0 :(得分:1)
如documentation中所述:
标准库提供以下类型的std :: atomic模板的特化:
和double
不在列表中。非成员函数也有注释:
所有成员都有非成员函数模板等价物 std :: atomic的函数。那些非会员职能可能是 另外为非特化的类型重载 std :: atomic,但能够保证原子性。 唯一这样的类型 在标准库中是std :: shared_ptr 。
因此不支持double
。