gpt4 book ai didi

c++ - 为什么使用右值引用时unique_ptr的所有权没有转移?

转载 作者:行者123 更新时间:2023-12-03 07:53:33 25 4
gpt4 key购买 nike

如果我运行代码

class Myc {
private:
int m{0};

public:
Myc(int ii) : m{ii} {};
~Myc() { std::cout << "Myc Destructed\n"; }
int getM() const { return m; }
};

void foo(std::unique_ptr<Myc> other) { std::cout << "End foo\n"; }

int main() {
std::unique_ptr<Myc> pm = std::make_unique<Myc>(1);

foo(std::move(pm));

std::cout << "End main \n";
}

pm 的所有权转移给 foo,输出为

End foo
Myc Destructed
End main

但是如果将 foo 更改为

void foo(std::unique_ptr<Myc> &&other) { std::cout << "End foo\n"; }

pm 的所有权没有转移到 foo,因为输出是

End foo
End main
Myc Destructed

我已经在 clang 和 gcc 中尝试过这个。为什么使用右值引用时 pm 的所有权没有转移给 foo?

最佳答案

当您想要转移所有权时,按值传递unique_ptr(或任何智能指针)。

通过引用传递不会改变所有权,如果函数不改变所有权,也许它不需要智能指针作为参数(裸指针通常更好)。

更直接地回答您的问题:当您按值传递时,形式参数(other)是从实际参数移动构造的。移动构造函数负责转移所有权。然而,当您通过引用传递时,形式参数是对现有对象的引用 - 不会创建新对象,因此移动构造函数永远不会发生。

关于c++ - 为什么使用右值引用时unique_ptr的所有权没有转移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76568526/

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