Understanding std::move and unique_ptr



我是C 11的新手,并试图了解std::moveunique_ptr的含义,并编写以下代码,我以两种不同的方式在unique_ptr上使用std::move

void unique_ptr_plain_move() {
  unique_ptr<int> intptr(new int(10));
  unique_ptr<int> intptr2;
  printf("*intptr = %dn", *intptr);
  intptr2 = std::move(intptr);
  printf("*intptr2 = %dn", *intptr2);
  // as expected, crash here as we have already moved intptr's ownership.
  printf("*intptr = %dn", *intptr);
}
/////////////////////////////////////////////
void function_call_move(unique_ptr<int>&& intptr) {
  printf("[func] *intptr = %dn", *intptr);
}
void unique_ptr_function_call_move() {
  unique_ptr<int> intptr(new int(10));
  printf("*intptr = %dn", *intptr);
  function_call_move(std::move(intptr));
  // this does not crash, intptr still has the ownership of its pointed instance ....
  printf("*intptr = %dn", *intptr);
}

unique_ptr_plain_move()中,intptr2std::move之后获得intptr的所有权,因此我们无法再使用intptr。但是,在unique_ptr_function_call_move()中,当在函数调用中使用std::move时,intptr仍然拥有其指数实例的所有权。当我们将std::move(unique_ptr)传递给功能时,我能知道到底发生了什么?谢谢。

这里的关键概念是std::move本身不会动作任何动作。您可以将其视为将对象标记为可以从中移动的对象。

function_call_move的签名是

void function_call_move( unique_ptr<int>&& ptr );

这意味着它只能接收可以从正式称为RVALUE的对象,并将其绑定到参考。将RVALUE与RVALUE参考相关的行为也不使原始对象的状态无效。

因此,除非function_call_move实际将ptr移至其中的另一个std::unique_ptr,否则您对function_call_move(std::move(intptr));的呼叫不会无效intptr,并且您的使用情况将完全很好。

相关内容

  • 没有找到相关文章

最新更新