std::is_same用于编译期严格判断两类型是否完全相同(含cv限定符和引用性),不进行类型转换;常与enable_if或c++20 requires配合实现sfinae或约束,需注意_v与::value的版本兼容性及引用/cv处理顺序。
is_same 的基本用法和判断逻辑
std::is_same 是 C++11 引入的类型特性模板,用于在编译期判断两个类型是否完全相同(包括 cv 限定符和引用性)。它不比较值,也不做类型转换推导——只看模板实参展开后的最终类型是否字面一致。
常见误用是以为 std::is_same<int long>::value</int> 可能为 true(实际为 false),或拿它检测“可隐式转换”关系(那是 std::is_convertible 的事)。
-
std::is_same<int int>::value</int>→ true -
std::is_same<const int>::value</const>→ false(cv 限定符不同) -
std::is_same<int int>::value</int>→ false(引用 vs 非引用) -
std::is_same<t typename std::remove_reference_t>&>::value</t>→ 对任意T都为 true(因为去引后加引又还原)
在模板中配合 enable_if 使用的典型场景
最常配合 std::enable_if 做 SFINAE 分支选择,比如只对某个具体类型启用函数重载:
template<typename T>
auto func(T t) -> std::enable_if_t<std::is_same_v<T, std::string>, void> {
// 仅当 T 是 std::string 时参与重载决议
}
注意必须用 std::is_same_v<t std::string></t>(C++17 起的变量模板)或 std::is_same<t std::string>::value</t>,不能直接写 std::is_same<t std::string></t> —— 后者是个类型,不是布尔值。
立即学习“C++免费学习笔记(深入)”;