📅  最后修改于: 2023-12-03 15:29:53.727000             🧑  作者: Mango
在C++11标准中,新增了一个类型特性函数 std::is_trivial
,用于判断一个类型是否是平凡的,即是否可以进行浅拷贝,包括默认构造函数、拷贝构造函数、移动构造函数、赋值构造函数、移动赋值函数和析构函数是如何定义的。
在C++17标准中,std::is_trivial
的行为被扩展,对于非联合体(非 union)和非类类型(non-class types)的标量类型(scalar type),其结果是 true
。对于所有其他类型,其行为是由 C++11 标准定义的。
template< class T >
struct is_trivial;
template< class T >
inline constexpr bool is_trivial_v = is_trivial<T>::value;
使用时,可通过 std::is_trivial<T>::value
或其简写形式 std::is_trivial_v<T>
返回一个 bool
类型的值,表示类型 T
是否为平凡类型。
以下是一个示例:
#include <iostream>
#include <type_traits>
struct A {
int a;
};
struct B {
int b;
B() {}
};
int main() {
std::cout << std::boolalpha;
std::cout << std::is_trivial<A>::value << std::endl; // false
std::cout << std::is_trivial_v<A> << std::endl; // false
std::cout << std::is_trivial<B>::value << std::endl; // false
std::cout << std::is_trivial_v<B> << std::endl; // false
std::cout << std::is_trivial<int>::value << std::endl; // true
std::cout << std::is_trivial_v<int> << std::endl; // true
return 0;
}
上述代码定义了两个结构体 A
和 B
,其中 A
存在一个数据成员 a
,B
除了存在一个相同类型的数据成员 b
,还显式定义了默认构造函数。然后使用 std::is_trivial
判断类型 A
、B
和 int
是否为平凡类型,将结果输出到控制台。
执行结果如下:
false
false
false
false
true
true
显然,类型 A
和 B
都不是平凡类型,而 int
是平凡类型。
需要注意的是,std::is_trivial
返回的结果只是对类型是否为平凡类型的静态判断,不同的实现可能会有不同的行为。在实际使用中,建议配合其他理论知识和具体场景使用。