为什么C++中typeid显示两类型相同但std::is_same返回false
问题核心原因
- 首先明确两个类型的真实差异:
你的pointee_type1是std::remove_pointer_t<Whale<char>*>,推导结果为纯值类型Whale<char>;
而pointee_type2是decltype(*static_ptr_to_object),根据C++标准,对指针做解引用操作得到的是左值表达式,decltype作用于非标识符的左值表达式时会推导为左值引用类型,因此最终类型是Whale<char>&。 - 为什么
typeid判断二者相同?typeid运算符的规则是:如果操作数是引用类型,会直接忽略引用限定符,取被引用的目标类型做比对。因此typeid(Whale<char>&)和typeid(Whale<char>)返回的是同一个type_info实例,运行时比对结果为相等。 - 为什么
std::is_same_v返回false,且pointee_type2::member编译报错?
编译期的类型比对是严格匹配所有限定符的,引用类型和纯值类型本身就是不同的类型,因此std::is_same_v返回false。同时引用类型不属于类类型,不能直接使用::作用域运算符访问成员,所以你直接写pointee_type2::member会触发编译错误。
修复方案
只需要给pointee_type2去除引用限定即可,修改对应代码:
#include <type_traits> // 需引入类型处理工具头文件 using pointee_type2 = std::remove_reference_t<decltype(*static_ptr_to_object)>;
修改后两个类型完全一致,静态断言和成员访问都可以正常编译运行。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

