微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数将 const ref 返回到 std::unique_ptr,它可以返回 null 吗?

如何解决函数将 const ref 返回到 std::unique_ptr,它可以返回 null 吗?

我有一个将 const ref 返回到 std::unique_ptr 的函数。我从某个容器中得到这个 ptr。当我的 std::unique_ptr 容器中没有输入值的适当对象时,我希望有可能返回 nullptr 或其他东西。 const ref 似乎是不可能的。肯定有返回 const 原始指针的选项,但如果可能的话,我想坚持使用 std::unique_ptr。

解决方法

如果您有一个返回对象引用的接口,则该接口引用了程序中某处存在的对象。如果在尝试生成此类引用的过程中,您发现用户输入的格式不正确或不存在此类对象,则您有以下选择:

  1. 抛出异常。这通常是我们识别功能用户做错了什么,他们要求不存在的东西的情况的方式。

  2. 将函数更改为按值返回而不是按引用返回。在这种情况下,它可能是一个裸指针值,而不是一个引用。

无论如何,几乎没有理由从任何 API 显式返回对 unique_ptr 的左值引用。 unique_ptr 代表所有权,如果 API 直接显示所有权,它应该代表所有权从源到目标的转移。返回对 unique_ptr 的右值引用的函数意味着它赋予调用者所指向对象的所有权。

如果没有发生所有权转移,则不应在 API 中使用 unique_ptr

请注意,知道包含unique_ptr的容器与碰巧包含unique_ptr的容器之间存在差异. vector<T> 是一个广义数组,因此 operator[] 返回 T& 的事实是可以的,即使 T 恰好是 unique_ptr。容器的用户知道 T 是什么意思以及如何使用它。

相比之下,如果您的容器概念上是一个 unique_ptr 的容器,那么它的 API 应该认识到这一事实。

,
class A {
public:
    const std::unique_ptr<B>& function() {
        return m_uni;
    }
private:
    std::unique_ptr<B> m_uni{nullptr};
};

这有效,返回的 unique_ptr 为 nullptr。是的,这是允许的,也是可能的。尽管如此,返回对 unique_ptr 的引用还是一种代码味道。如果您可以分享更多关于为什么要使用 unique_ptr 以及您使用此容器的目的的信息,也许有人可以提供替代方案。

unique_ptr 变量本身的修饰符(const&*)与存储在 unique_ptr 中的值无关。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。