我只是想知道为什么我可以传递所有权而不是以下代码中的引用?我知道使用std::unique_ptr< car > pcar( new toyota() );可以让我通过引用,但是为什么这不适用于所有权转让?

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

最佳答案

pcar不是std::unique_ptr< car >。为了进行编译,需要创建一个临时的std::unique_ptr< car >绑定(bind)到该参数。但是您无法创建临时目录,因为没有(转换)的unique_ptr构造函数接受左值的unique_ptr。

基本上,如果编译了该临时对象,则将创建该临时对象,获得该指针的所有权,然后在函数返回时销毁该指针,因此pcar拥有的指针将被销毁,不是很直观,也不是所期望的行为。

07-24 09:46
查看更多