gpt4 book ai didi

c++ - 了解 std::move 和 unique_ptr

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:04 24 4
gpt4 key购买 nike

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

void unique_ptr_plain_move() {
unique_ptr<int> intptr(new int(10));
unique_ptr<int> intptr2;

printf("*intptr = %d\n", *intptr);
intptr2 = std::move(intptr);
printf("*intptr2 = %d\n", *intptr2);
// as expected, crash here as we have already moved intptr's ownership.
printf("*intptr = %d\n", *intptr);
}

/////////////////////////////////////////////

void function_call_move(unique_ptr<int>&& intptr) {
printf("[func] *intptr = %d\n", *intptr);
}

void unique_ptr_function_call_move() {
unique_ptr<int> intptr(new int(10));

printf("*intptr = %d\n", *intptr);
function_call_move(std::move(intptr));
// this does not crash, intptr still has the ownership of its pointed instance ....
printf("*intptr = %d\n", *intptr);
}

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

最佳答案

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

function_call_move 的签名是

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

这意味着它只能接收可以 move 的对象,正式称为右值,并将其绑定(bind)到一个引用。将右值关联到右值引用的行为也不会使原始对象的状态无效。

因此,除非 function_call_move 实际上将 ptr move 到其中的另一个 std::unique_ptr,否则您对 function_call_move(std: :move(intptr)); 不会使 intptr 失效,您的使用将完全没问题。

关于c++ - 了解 std::move 和 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21537935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com