如何通过接口传递unique_ptr?

时间:2013-05-27 21:09:59

标签: c++ c++11

我只是想知道为什么我能够在以下代码中传递所有权而不是引用?我知道使用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;
}

1 个答案:

答案 0 :(得分:3)

pcar不是std::unique_ptr< car >。为了编译它,需要创建一个临时的std::unique_ptr< car >来绑定到该参数。但是你不能创建一个临时的,因为unique_ptr没有(转换)构造函数,它接受一个左值unique_ptr。

基本上,如果编译,临时将被创建,取得指针的所有权,然后在函数返回时被销毁,所以pcar所拥有的指针将被破坏,不是非常直观也不是所希望的行为。