unique_ptr返回局部对象可以成功?

新手上路,请多包涵

unique_ptr<int> test(){

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

}

代码如上,ppp可以成功返回没有报错,ppp是个左值,那肯定不会是移动的吧,那就要执行拷贝构造函数吧,但是unique_ptr没有拷贝构造啊。。。。。
哪位大大解释一下啊

阅读 2.8k
1 个回答
代码如上,ppp可以成功返回没有报错,ppp是个左值,那肯定不会是移动的吧,那就要执行拷贝构造函数吧,但是unique_ptr没有拷贝构造啊。。。。

你这个判断是错的,给你一个例子如下:

#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回来的局部值,这是右值而不是左值;
其次,std::unique_ptr不接受左值作为入参的拷贝构造函数. 只有这个:

unique_ptr( unique_ptr&& u ) noexcept;

你再揣摩一下这个例子吧:
https://github.com/lynnboy/Cp...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题