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

为何decltype与typeid返回类型不同?附C++示例代码

问题解析:为什么两个typeid输出结果不同?

先看你给出的代码:

#include <iostream>
#include <memory>

class Base {
public :
    virtual void print() {
        std::cout << "from base class\n";
    }
};

class Derived : public Base {
public :
    void print() override {
        std::cout << "from derived class \n";
    }
};

int main() {
    std::unique_ptr< Base > d = std::make_unique< Derived >();
    std::cout << typeid( *( d.get() ) ).name() << "\n";
    std::cout << typeid( decltype( *( d.get() ) ) ).name() << "\n";
}

运行后第一个输出7Derived,第二个输出4Base,这确实容易让人疑惑,其实核心是编译期静态类型推导和运行时动态类型识别的区别:

  • 第一个typeid( *(d.get()) ):这里的*(d.get())是一个实际的多态对象——虽然d是unique_ptr<Base>类型,但它指向的是Derived的实例。因为Base类包含虚函数,满足多态条件,typeid会在运行时去识别对象的真实类型,所以返回的是Derived的类型信息。

  • 第二个typeid( decltype( *(d.get()) ) ):decltype是编译期的类型推导工具,它只关注表达式的静态类型,完全不关心运行时的实际对象是什么。d.get()返回的静态类型是Base*,解引用后得到的静态类型是Base&,所以decltype(*(d.get()))的结果就是Base&。而typeid处理引用类型时,会返回其引用的底层类型信息,所以最终输出4Base。

简单总结:前者看的是运行时对象的真实类型,后者看的是编译期就确定的静态声明类型,这就是两者结果不同的关键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:45