std::is_trivially_copyable 是编译期类型特征,用于判断类型是否可安全用 memcpy 拷贝;需满足:特殊成员函数平凡或已删除、无虚函数/虚基类、所有成员及基类均可平凡拷贝、内存布局连续无歧义。
std::is_trivially_copyable 是 C++ 标准库中一个编译期类型特征(type trait),用于在编译时判断某个类型是否“可平凡拷贝”——即它的对象能否安全地用 memcpy 进行字节级拷贝,而不会导致未定义行为或逻辑错误。
一个类型 T 被判定为 std::is_trivially_copyable_v,必须同时满足:
= delete);trivially copyable;它不是语法装饰,而是高性能底层操作的“安全开关”:
memcpy 级别优化(比逐成员调用构造函数快得多);std::bit_cast(C++20)的合法使用前提;std::vector)对 trivially copyable 元素会启用更激进的内存操作路径。以下代码在编译期就能得出确定结果:
int、float、std::array → true;struct S {} 或仅含 int 成员的 struct A { int x; }; → true;struct B { B(const B&) {} int x; }; → false;std::string 或 std::vector 成员的类 → false;const int x = 42;(带 brace-or-equal-initializer),也可能破坏 trivially copyable(取决于是否触发隐式非平凡行为,C++17 起更严格)。std::is_trivial 要求更严:它不仅要求 trivially copyable,还额外要求有平凡的默认构造函数(即不能有用户提供的默认构造,也不能有带默认初始化器的非静态成员)。所以:
trivial 类型一
定是 trivially copyable;trivially copyable 不一定 trivial(比如一个只有 int 成员、但显式写了 MyClass() = default; 的类,仍是 trivially copyable,且通常是 trivial;但如果加了 int x{0};,就可能失去 trivial,但未必失去 trivially copyable)。