1. 报错信息
编译期错误,gcc version 7.5.0
错误示例代码:
#include <atomic>
#include <iostream>
#include <vector>
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
。
cppreference对TriviallyCopyable
的稍微总结了一下,“这意味着可平凡复制类没有虚函数或虚基类”。
我们一条一条看
TriviallyCopyable
类型主要分为三类:
- 标量类型
这里的标量我猜测应该是int,double,long
之类的内置类型。 - 类
而对于类,cppreference说的6条,可以总结成三条:
①这个类,至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符未弃置 ,就是至少有一个未被delete;
②未被弃置的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符都是平凡的;
③析构函数也得是平凡的。
所以,主要问题在于,“平凡”是个什么意思?这个后边说 TriviallyCopyable
对象组成的数组,这个好理解。
关于“平凡”,cppreference给出的解释是这样的:
其实都差不多,主要在于一是不能由用户显示定义,二是该类不能存在虚函数以及虚基类,这也是cppreference说“这意味着可平凡复制类没有虚函数或虚基类”的由来。
再回到文章文章开头的示例代码,问题就变成了std::vector\<int\>
是不是TriviallyCopyable
了,答案明显是否定的。