TriviallyCopyable

TriviallyCopyable

所谓triviallyCopyable必须满足以下6点要求:

(1) 每一个拷贝构造函数(copy constructor)是trivial

(2) 每一个移动构造函数(move constructor)是trivial

(3) 每个拷贝赋值表达式(copy assignment operator)是trivial

(4) 每一个移动复制表达式(move assignment operator)是rivial

(5) 至少有一个拷贝构造(copy constructor)、移动拷贝(move constructor)、拷贝赋值表达式(copy assignment)、移动赋值(move assignment)是non-deleted

(6) 析构函数是trivial

Trival 是甚麽意思:

Trival Copy Constructor,需要满足以下6个条件才算是Trivial Copy Constructor

(1) 拷贝构造函数不是程序员明确定义的(隐式的或是默认的)

(2) Class T 没有虚拟的成员函数(virtual member function)

(3) Class T没有虚拟基类s

(4) Class T 的直接基类的拷贝构造函数是trivial

(5) Class T 的非静态类成员变量的拷贝构造函数是trivial

(6) Class T 没有非静态的volatile-qualified类型的成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//  c++ cppatomic.cpp -o main -std=c++11
#include <iostream>
#include <atomic>
#include <type_traits>

struct B
{
virtual void fun() {}
};
struct A
{
int _m ;
};
struct C
{
virtual void func() {}
};
struct D
{
public:
virtual void fun() {}
};
class E : public D
{
};
struct F
{
static int i ;
};
int main()
{
std::atomic<A> a;
std::atomic<A*> apt;
std::cout<<std::boolalpha;
std::cout<<"A: is_trivial: " <<std::is_trivial<A>::value<<std::endl;
std::cout<<"B: is_trivial: " <<std::is_trivial<B>::value<<std::endl;
std::cout<<"C: is_trivial: " <<std::is_trivial<C>::value<<std::endl;
std::cout<<"D: is_trivial: " <<std::is_trivial<D>::value<<std::endl;
std::cout<<"E: is_trivial: " <<std::is_trivial<E>::value<<std::endl;
std::cout<<"F: is_trivial: " <<std::is_trivial<F>::value<<std::endl;
std::atomic<C*> c;

// error: _Atomic cannot be applied to type 'C' which is not trivially copyable
// std::atomic<C> c2;

return 0;
}
1
2
3
4
5
6
A: is_trivial: true
B: is_trivial: false
C: is_trivial: false
D: is_trivial: false
E: is_trivial: false
F: is_trivial: true