鍍金池/ 問(wèn)答/C++/ unique_ptr返回局部對(duì)象可以成功?

unique_ptr返回局部對(duì)象可以成功?

unique_ptr<int> test(){

      unique_ptr<int> ppp(new  int(10));
      return   ppp;

}

代碼如上,ppp可以成功返回沒(méi)有報(bào)錯(cuò),ppp是個(gè)左值,那肯定不會(huì)是移動(dòng)的吧,那就要執(zhí)行拷貝構(gòu)造函數(shù)吧,但是unique_ptr沒(méi)有拷貝構(gòu)造啊。。。。。
哪位大大解釋一下啊

回答
編輯回答
半心人
代碼如上,ppp可以成功返回沒(méi)有報(bào)錯(cuò),ppp是個(gè)左值,那肯定不會(huì)是移動(dòng)的吧,那就要執(zhí)行拷貝構(gòu)造函數(shù)吧,但是unique_ptr沒(méi)有拷貝構(gòu)造啊。。。。

你這個(gè)判斷是錯(cuò)的,給你一個(gè)例子如下:

#include <iostream>
#include <memory>

using namespace std;
static unique_ptr<int> p1 = std::make_unique<int>(10);

// move -> copy construction -> failed
unique_ptr<int> foo()
{
    auto p = make_unique<int>(10);
    return p;                   // 1 ok p is local parameter(rvalue) can run it with move
    //return move( p );         // 2 also ok
    //return p1;                // NOK. p1 is lvalue can not performance move on it.
}

int main()
{
    unique_ptr<int> p = foo();

    cout << *p << endl;
    return 0;
}

首先,ppp是return回來(lái)的局部值,這是右值而不是左值;
其次,std::unique_ptr不接受左值作為入?yún)⒌目截悩?gòu)造函數(shù). 只有這個(gè):

unique_ptr( unique_ptr&& u ) noexcept;

你再揣摩一下這個(gè)例子吧:
https://github.com/lynnboy/Cp...

2018年6月25日 16:09