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

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了,答案明显是否定的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值