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

gam*_*n67 2 c++ atomic stdstring thread-safety 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我更改为

std::atomic<std::string> test("0");
Run Code Online (Sandbox Code Playgroud)

它将给出此错误

/ 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测试了该代码。遵循此线程std :: atomic <std :: string>是否正常工作?原子字符串应该可以正常工作,但是出现了这个错误。这是什么原因呢?以及如何std::atomic<std::string>正确使用?

Nir*_*Nir 7

std :: string不能与std :: atomic一起使用,因为它不是TriviallyCopyable

请参阅此处的说明:https : //en.cppreference.com/w/cpp/atomic/atomic

可以使用同时满足CopyConstructible和CopyAssignable的任何TriviallyCopyable类型T实例化主要的std :: atomic模板。如果以下任何值为false,则程序格式错误:

https://zh.cppreference.com/w/cpp/named_req/TriviallyCopyable