为何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
相关产品推荐
相关产品推荐

