c ++ typeid使用get()和*为同一unique_ptr返回不同的值

Sit*_*esh 2 c++ inheritance rtti typeid unique-ptr

我遇到了一段代码,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;
}
Run Code Online (Sandbox Code Playgroud)

输出为:

Object types are not of same 
Type name of *bd.name():      1D 
Type name of bd.get().name(): P1B
Run Code Online (Sandbox Code Playgroud)

get()的输出与使用*取消引用的输出name()不同。另一个观察结果是,当类中没有定义虚函数时(上述示例中没有),get()和*都打印相同的输出。void foo()

问题:

当类中没有虚函数时,为什么get()和*给出不同的输出?

实时示例:https : //gcc.godbolt.org/z/Tiy-Cn

EDIT-1根据unique_ptr上的*,它说“返回* this拥有的对象,等效于* get()。”

Max*_*mer 9

*bd 返回参考。

bd.get() 返回一个指针。


回复:您的编辑:请注意,它说“相当于* get()”,而不是“相当于get()”