You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用decltype和remove_reference获取指针值类型的C++代码运行异常

问题原因分析
  • decltype(*rp)对int*类型解引用得到的结果是int&类型,这一步是符合语法规则的。
  • 错误出在类型别名定义行:using no_ref_type = std::remove_reference<return_type>::type();。你在std::remove_reference<return_type>::type后额外添加了(),在C++类型声明语法中,该写法代表返回值为std::remove_reference<return_type>::type、无入参的函数类型,而非你预期的去掉引用后的int类型。因此typeid输出的就是这个函数类型的签名,也就是你看到的int __cdecl(void)。
修复方案

由于处理的是指针或迭代器解引用的结果,std::remove_pointer确实不适用(迭代器不属于指针类型,std::remove_pointer对其无效),只需修正类型别名的语法错误即可:

C++11 兼容写法

如果在模板函数内使用,需要额外加typename标识依赖类型:

// 非模板场景
using no_ref_type = std::remove_reference<return_type>::type;
// 模板场景
using no_ref_type = typename std::remove_reference<return_type>::type;

C++14 及以上简化写法

可以直接使用标准库提供的别名模板,代码更简洁:

// 非模板场景
using no_ref_type = std::remove_reference_t<return_type>;
// 模板场景
using no_ref_type = typename std::remove_reference_t<return_type>;

修正后第二行输出就会是你预期的int。

内容的提问来源于stack exchange,提问作者JadeSpy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:04