unique_ptr没有移动,为什么这个工作?

时间:2018-05-28 12:00:56

标签: c++11 unique-ptr

在代码审查期间,我发现期望unique_ptr的C ++函数通过std :: move传递uniqe_ptr,但函数也没有将unique_ptr作为返回值移动,也没有将调用者返回unique_ptr返回给它#s; s unique_ptr,所以我希望这会崩溃。

示例:

   std::unique_ptr<X> fun(std::unique_ptr<X> p) {
     // Do something with the unique_ptr p
     return p;
   }

在其他地方,我发现了以下电话:

void someFunction() {
  auto p = std::make_unique<X>();
  //...
  fun(std::move(p));
  // Do something else
  fun(std::move(p));
  //...
}

所以我想知道这段代码是否正常,或者它是否只是运气。

[编辑]:完成了示例

2 个答案:

答案 0 :(得分:2)

在这个片段中:

fun(std::move(p));
fun(std::move(p));
移动了

p,使其为空。所以第二次调用fun()时,它会收到一个空指针。哪个好,只要它不取消引用那个指针。

答案 1 :(得分:0)

在我看来,我的目的是像这样打电话给fun

p = fun(std::move(p));
p = fun(std::move(p));

在这种情况下,p的所有权将来回传递给函数。我宁愿将fun设为空函数,并通过引用或{* 1}}类型传递p