我的程序很简单,我想使用原子类型。它适用于int
或double
,但不适用于std::string
。
#include <iostream>
#include <atomic>
#include <string>
int main()
{
std::atomic<int> test(0); // works
std::cout<<test; // will print 0
return 0;
}
如果我更改为
std::atomic<std::string> test("0");
它将给出此错误
/ usr / include / c ++ / 6 / atomic:在“ struct”的实例中 std :: atomic>’:main.cpp:16:34:
从这里需要/ usr / include / c ++ / 6 / atomic:178:7:错误:静态 断言失败:std :: atomic需要一个平凡的可复制类型 static_assert(__ is_trivially_copyable(_Tp), ^ ~~~~~~~~~~~~
我已经用C ++ 17,C ++ 14和C ++ 11测试了代码。在此线程Does std::atomic<std::string> work appropriately?之后,原子字符串应该可以正常工作,但是出现了这个错误。这是什么原因呢?以及如何正确使用std::atomic<std::string>
?
答案 0 :(得分:7)
std :: string不能与std :: atomic一起使用,因为它不是TriviallyCopyable
在此处查看说明: https://en.cppreference.com/w/cpp/atomic/atomic
主std :: atomic模板可以使用任何实例化 满足CopyConstructible和 CopyAssignable。如果以下任何值,则该程序格式不正确 是错误的:
https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable