gpt4 book ai didi

c++ - std::unique_ptr::release() 与 std::move()

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:57 29 4
gpt4 key购买 nike

我有一个表示运行时上下文并构建树的类,树根保存在 unique_ptr 中。构建树完成后,我想提取树。这是它的样子(不可运行,这不是调试问题):

class Context {
private:
std::unique_ptr<Node> root{new Node{}};
public:
// imagine a constructor, attributes and methods to build a tree
std::unique_ptr<Node> extractTree() {
return std::move(this->root);
}
};

所以我使用 std::move()Context 实例中提取根节点。

但是,除了使用 std::move() 之外,还有其他选择,例如:

std::unique_ptr<Node> extractTree() {
// This seems less intuitive to me
return std::unique_ptr<Node>{this->root.release()};
}

std::move() 是最好的选择吗?

最佳答案

您绝对应该选择第一个版本,因为第二个版本基本上完成了第一个版本所做的一切,但代码更多,可读性更差。

从哲学上讲,第二个版本移动唯一指针,不多也不少。那么为什么要绕着 table 转,而不是使用已经存在的、更具可读性和更惯用的 std::unique_ptr(std::unique_ptr&&) 呢?

最后,如果你的智能指针在未来某个地方将持有自定义删除器,第一个版本将确保删除器也移动,第二个版本不会移动删除器。我完全可以想象一个程序员使用 release 从自定义删除器 unique_pointer 构建非自定义删除器唯一指针。使用移动语义,程序将无法编译。

关于c++ - std::unique_ptr::release() 与 std::move(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36030464/

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