type_traits是C++编译期类型判断工具集,含std::is_integral_v等变量模板;std::is_same_v用于SFINAE和约束;std::remove_reference_t仅去引用,std::decay_t还移除cv、数组转指针、函数转指针。

type_traits 是 C++ 标准库中用于在编译期判断、查询和变换类型的工具集,本质是一组模板类和变量模板,不是运行时函数,也不产生任何代码开销。
怎么用 std::is_integral_v 判断基础类型
它比手写 if constexpr + 多个 std::is_same_v 更简洁安全。例如检查 T 是否为整型:
template<typename T> constexpr bool is_int_like = std::is_integral_v<T> || std::is_enum_v<T>;
-
std::is_integral_v<int>展开为true,std::is_integral_v<double>为false - 注意后缀
_v(value)是 C++17 引入的变量模板,直接返回布尔值;C++11/14 要写std::is_integral<T>::value - 别误用
std::is_integral<T>本身——它是个类型,不是布尔值,直接用会编译失败
为什么 std::is_same_v<T, U> 常用于 SFINAE 和约束
它是模板偏特化、enable_if 和 C++20 requires 的底层支撑。比如限制函数只接受 float 或 double:
template<typename T>
auto scale(T x) -> std::enable_if_t<std::is_same_v<T, float> || std::is_same_v<T, double>, T> {
return x * 2.0f;
}-
std::is_same_v<T, U>在类型完全一致(包括 cv 限定符)时才为true,std::is_same_v<const int, int>是false - 若需忽略 const/volatile,用
std::is_same_v<std::remove_cv_t<T>, std::remove_cv_t<U>> - 别在运行时 if 中用它——编译器无法优化掉无用分支,应配合
if constexpr
std::remove_reference_t 和 std::decay_t 的区别在哪
两者都“去引用”,但适用场景不同:
立即学习“C++免费学习笔记(深入)”;
-
std::remove_reference_t<T&&>只去掉引用符号,std::remove_reference_t<int&&>→int,std::remove_reference_t<int&>→int -
std::decay_t<T>还额外:移除 const/volatile、数组转指针、函数转函数指针——模拟“传值”语义,常用于完美转发后的类型标准化 - 对
int[3]:remove_reference_t仍是int[3],而decay_t变成int* - 对
const int&:remove_reference_t是const int,decay_t是int
真正难的是组合使用——比如写一个泛型容器的 emplace_back,既要判别是否可移动,又要剥离引用和 cv 限定,还要处理数组退化。漏掉一层 std::remove_cvref_t(C++20)或手动组合 remove_cv_t<remove_reference_t<T>>,就可能让重载决议出错或触发意外的拷贝构造。











