📜  C++中的is_trivial函数(1)

📅  最后修改于: 2023-12-03 15:29:53.727000             🧑  作者: Mango

C++中的is_trivial函数

在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;
}

上述代码定义了两个结构体 AB,其中 A 存在一个数据成员 aB 除了存在一个相同类型的数据成员 b,还显式定义了默认构造函数。然后使用 std::is_trivial 判断类型 ABint 是否为平凡类型,将结果输出到控制台。

执行结果如下:

false
false
false
false
true
true

显然,类型 AB 都不是平凡类型,而 int 是平凡类型。

需要注意的是,std::is_trivial 返回的结果只是对类型是否为平凡类型的静态判断,不同的实现可能会有不同的行为。在实际使用中,建议配合其他理论知识和具体场景使用。