следующая программа
#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";
}
первый выводит 7Поставлено но второй выводит 4Base. разве они оба не должны выводить один и тот же тип? (7Доставлено)

Результат такой, как ожидалось, разница в том, используется ли статический тип указателя или тип объекта, на который указывает указатель.
В первом случае используется d напрямую: поскольку d указывает на объект типа Derived. Здесь это фактический (во время выполнения) тип печатаемого объекта.
В случае decltype: используется статический тип выражения. Поскольку d является unique_ptr<Base>, типом d.get() является Base*, и разыменование дает Base.
Нет, decltype - это конструкция времени компиляции, и выражение не вычисляется.
хорошо, тогда ... Думаю, я просто прибегу к dynamic_cast. Это было полезно
Есть ли способ заставить decltype возвращать тип среды выполнения объекта? Если это невозможно, у меня есть другой дизайн, но я бы предпочел такой дизайн.