You need to enable JavaScript to run this app. 为什么C++中typeid显示两类型相同但std::is_same返回false
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 23:06:03