2016-06-26 25 views
0

Mit Bezug auf den folgenden CodeWie Kopieren einen unique_ptr von einem Typ zum anderen Werken

#include <iostream> 
#include <memory> 
using std::cout; 
using std::endl; 
using std::make_unique; 

struct Base {}; 
struct Derived : public Base {}; 

int main() { 

    auto base_uptr = std::unique_ptr<Base>{make_unique<Derived>()}; 
    return 0; 
} 

der Konstruktor für die unique_ptr aufgerufen wird? Ich habe einen Blick auf cppreference.com und die Konstrukteurs-I (pre C++ 17) war (aus Gründen der Fertigstellung) gefunden

constexpr unique_ptr(); 
constexpr unique_ptr(nullptr_t); 
explicit unique_ptr(pointer p); 
unique_ptr(pointer p, /* see below */ d1); 
unique_ptr(pointer p, /* see below */ d2); 
unique_ptr(unique_ptr&& u); 

template< class U, class E > 
unique_ptr(unique_ptr<U, E>&& u); 

Keiner von ihnen scheinen den Zeiger des anderen Typs zu übernehmen. Was vermisse ich? Welcher Konstruktor wird aufgerufen?

Danke!

Antwort

8

Nummer 6, der Vorlagenkonstruktor.

template< class U, class E > 
unique_ptr(unique_ptr<U, E>&& u); 

, die unter einigen anderen Bedingungen erfordert, dass "unique_ptr<U, E>::pointer ist implizit konvertierbar pointer". Mit anderen Worten, U* muss implizit in den Zeigertyp konvertierbar sein, den Ihre unique_ptr speichert. Was in Ihrem Fall ist, ist, da Derived* implizit in Base* umwandelbar ist.