error: static assertion failed: std::atomic requires a trivially copy type

1. 报错信息

error: static assertion failed: std::atomic requires a trivially copy type_第1张图片
编译期错误,gcc version 7.5.0

错误示例代码:

#include 
#include 
#include 

int main()
{
    std::atomic<std::vector<int>> a;
}

2. 问题分析

报错信息里明确说了,atomic类需要一个trivially copy type,所以关键就在于什么是trivially copy type
在https://en.cppreference.com/w/cpp里边,解释了什么是trivially copy type
error: static assertion failed: std::atomic requires a trivially copy type_第2张图片cppreference对TriviallyCopyable的稍微总结了一下,“这意味着可平凡复制类没有虚函数或虚基类”。

我们一条一条看
TriviallyCopyable类型主要分为三类:

  • 标量类型
    这里的标量我猜测应该是int,double,long之类的内置类型。

  • 而对于类,cppreference说的6条,可以总结成三条:
    ①这个类,至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符未弃置 ,就是至少有一个未被delete;
    ②未被弃置的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符都是平凡的;
    ③析构函数也得是平凡的。
    所以,主要问题在于,“平凡”是个什么意思?这个后边说
  • TriviallyCopyable对象组成的数组,这个好理解。

关于“平凡”,cppreference给出的解释是这样的:

error: static assertion failed: std::atomic requires a trivially copy type_第3张图片

error: static assertion failed: std::atomic requires a trivially copy type_第4张图片error: static assertion failed: std::atomic requires a trivially copy type_第5张图片error: static assertion failed: std::atomic requires a trivially copy type_第6张图片error: static assertion failed: std::atomic requires a trivially copy type_第7张图片

其实都差不多,主要在于一是不能由用户显示定义,二是该类不能存在虚函数以及虚基类,这也是cppreference说“这意味着可平凡复制类没有虚函数或虚基类”的由来。

再回到文章文章开头的示例代码,问题就变成了std::vector\是不是TriviallyCopyable了,答案明显是否定的。

你可能感兴趣的:(C++相关,c++,开发语言)