有 std::is_trivially_copyable 的演示代码 https://en.cppreference.com/w/cpp/types/is_trivially_copyable
void test()
{
struct A {
int m;
A(const A& o):m(o.m){}
};
struct D {
int m;
D(D const&) = default; // -> trivially copyable
D(int x) : m(x + 1) {}
};
std::cout << std::is_trivially_copyable<A>::value << '\n';
std::cout << std::is_trivially_copyable<D>::value << '\n';
}
Run Code Online (Sandbox Code Playgroud)
A 是不可复制的,但 D 可以。我使用默认行为实现 A 的复制构造函数。是什么造成了这种差异?
这是它在 C++ 中的定义方式: https://en.cppreference.com/w/cpp/language/copy_constructor#Trivial_copy_constructor
简单的复制构造函数 如果满足以下所有条件,则类 T 的复制构造函数是简单的:
非联合类的简单复制构造函数有效地复制参数的每个标量子对象(递归地包括子对象的子对象等),并且不执行其他操作。但是,不需要复制填充字节,甚至复制的子对象的对象表示也不需要相同,只要它们的值相同即可。
TriviallyCopyable 对象可以通过手动复制其对象表示来复制,例如使用 std::memmove。所有与 C 语言兼容的数据类型(POD 类型)都是可简单复制的。