Мне просто интересно, почему я могу передать право собственности, а не ссылку в следующем коде? Я знаю, что использование 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;
}
Если вы не хотите передавать право собственности, то нет причин, по которым не передавать ссылку на сам объект, например: 'car const & vehicle'. –
Я не думаю, что это возможно. Это порождает ошибку компилятора: 'недопустимая инициализация ссылки типа 'const car &' из выражения типа 'std :: unique_ptr'' http://ideone.com/NpHfKK –
Tek
@Tek: Идея в комментарии Juraj's (правильный) заключается в том, что вы сначала разыгрываете указатель, чтобы получить ссылку, а не передавать ее напрямую. – GManNickG