为什么std :: atomic <std :: string>给出平凡的可复制错误?

时间:2019-11-14 08:45:20

标签: c++ thread-safety atomic stdstring stdatomic

我的程序很简单,我想使用原子类型。它适用于intdouble,但不适用于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>

1 个答案:

答案 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