2 votes

c++ typeid renvoie différentes valeurs pour le même unique_ptr avec get() et *

Je suis tombé sur un bout de code où typeid est utilisé pour obtenir le type d'un unique_ptr pointant vers un objet polymorphe.

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;
}

La sortie est :

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

La sortie de name() est différent pour get() et le déréférencement avec *. Une autre observation est que lorsqu'il n'y a aucune fonction virtuelle définie dans la classe [sans void foo() dans l'exemple ci-dessus], les deux get() et * impriment la même sortie.

Questions :

Pourquoi les fonctions get() et * donnent des résultats différents lorsqu'il n'y a pas de fonctions virtuelles dans la classe ?

Exemple vivant : https://gcc.godbolt.org/z/Tiy-Cn

EDIT-1 Conformément à * sur un unique_ptr il est dit "Renvoie l'objet possédé par *this, équivalent à *get()."

10voto

Max Vollmer Points 5757

*bd renvoie une référence.

bd.get() renvoie un pointeur.


Re : y "équivalent à *get()" et non "équivalent à get()" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X