decltype和typeid返回不同的类型

时间:2018-05-19 10:10:33

标签: polymorphism c++14

以下计划

#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。 不应该两个输出相同的类型? (7Derived)

1 个答案:

答案 0 :(得分:0)

结果与预期的一样,不同之处在于指针的静态类型或指向对象的类型是否使用。

第一种情况,直接使用d:因为d指向Derived类型的对象。这是打印对象的实际(运行时)类型。

decltype case:中,使用的是表达式的静态类型。由于dunique_ptr<Base>d.get()的类型为Base*,解除引用时会Base