2013-05-27 3 views
3

Мне просто интересно, почему я могу передать право собственности, а не ссылку в следующем коде? Я знаю, что использование std::unique_ptr<car> pcar(new toyota()); позволит мне передать ссылку, но почему это не относится к передаче прав собственности?как пройти unique_ptr с интерфейсами?

#include <memory> 

class car{}; 

class toyota : public car{}; 

void someProcess(std::unique_ptr<car> vehicle) 
{ 
    //Ownership passed. 
} 

void otherProcess(std::unique_ptr<car> const & vehicle) 
{ 
    //Reference passed. 
} 

int main(int argc, char ** argv) 
{ 
    std::unique_ptr<toyota> pcar(new toyota()); 

    someProcess(std::move(pcar)); //Allowed to pass through car interface. 

    pcar.reset(new toyota()); 

    otherProcess(pcar); //Compiler error, can't pass reference even when car interface is implemented. 

    return 0; 
} 
+1

Если вы не хотите передавать право собственности, то нет причин, по которым не передавать ссылку на сам объект, например: 'car const & vehicle'. –

+0

Я не думаю, что это возможно. Это порождает ошибку компилятора: 'недопустимая инициализация ссылки типа 'const car &' из выражения типа 'std :: unique_ptr '' http://ideone.com/NpHfKK – Tek

+0

@Tek: Идея в комментарии Juraj's (правильный) заключается в том, что вы сначала разыгрываете указатель, чтобы получить ссылку, а не передавать ее напрямую. – GManNickG

ответ

3

pcar НЕ std::unique_ptr<car>. Для этого для компиляции необходимо создать временный std::unique_ptr<car> для привязки к этому аргументу. Но вы не можете создать временную структуру, поскольку нет конструктора (конвертирования) для unique_ptr, который принимает значение lvalue unique_ptr.

В принципе, если это скомпилировано, временное создавалось бы, владение указателем, а затем уничтожалось при возврате функции, поэтому указатель, принадлежащий pcar, был бы уничтожен, а не был бы очень интуитивным и желательным.