decltype и typeid возвращает другой тип - PullRequest
0 голосов
/ 19 мая 2018

следующая программа

#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 голосов
/ 19 мая 2018

Результат, как и ожидалось, и разница в том, что используется статический тип указателя или тип объекта, на который указывает указатель.

Первый случай, использующий d напрямую: as d указывает на объект типа Derived.Здесь это фактический (во время выполнения) тип печатаемого объекта.

В случае decltype: используется статический тип выражения , который используется,Поскольку d является unique_ptr<Base>, тип d.get() равен Base*, а разыменование дает Base.

...