2016-06-26 7 views
0

со ссылкой на следующий кодКак копирование unique_ptr одного типа в другой работает

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

который конструктор вызывается для unique_ptr? Я посмотрел на cppreference.com и конструкторы, которые я нашел (предварительно C++ 17) были (для завершения)

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

Ни один из них не кажется, принимает указатель другого типа. Что мне не хватает? Какой конструктор вызван?

Спасибо!

ответ

8

Номер 6, конструктор шаблонов.

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

Что требует, среди нескольких других условий, которые "unique_ptr<U, E>::pointer неявно конвертируются в pointer". Другими словами, U* должен быть неявно конвертируемым в тип указателя, который хранят ваши unique_ptr. Что в вашем случае, это так, поскольку Derived* неявно конвертируется в Base*.