我是C 11的新手,并试图了解std::move
和unique_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()
中,intptr2
在std::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
,并且您的使用情况将完全很好。