c ++ typeid возвращает разные значения для одного и того же unique_ptr с помощью get () и * - PullRequest
2 голосов
/ 24 октября 2019

Я наткнулся на один фрагмент кода, где typeid используется для получения типа unique_ptr, указывающего на полиморфный объект.

class B{virtual void foo()= 0;};
class D:public B{void foo() override{}};

int main()
{
    unique_ptr<B> bd = make_unique<D>();
    if (typeid(*bd) != typeid(bd.get()))
    {
        cout<<"Object types are not same"<<endl;
    }
    cout<<"Type name of *bd.name():      "<<typeid(*bd).name()<<endl;
    cout<<"Type name of bd.get().name(): "<<typeid(bd.get()).name()<<endl;
}

Вывод:

Object types are not of same 
Type name of *bd.name():      1D 
Type name of bd.get().name(): P1B

Вывод name() отличается для get () и разыменования с помощью *. Еще одно наблюдение состоит в том, что когда в классе не определены виртуальные функции [без void foo() в вышеприведенном примере], оба get () и * выводят один и тот же вывод.

Вопросы:

Почемуget () и * выдают различный вывод, когда в классе нет виртуальных функций?

Живой пример: https://gcc.godbolt.org/z/Tiy-Cn

EDIT-1 Согласно * для unique_ptr , там написано "Возвращает объект, принадлежащий * this, эквивалентно * get ()."

1 Ответ

9 голосов
/ 24 октября 2019

*bd возвращает ссылку.

bd.get() возвращает указатель.


Re: ваше редактирование: Обратите внимание, что оно говорит "эквивалентно * get () " а не " эквивалентно get () ".

...