函数 return 的 const ref 指向 std::unique_ptr,它可以 return 为 null 吗?

Function returns const ref to std::unique_ptr, can it return null?

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

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 中的值无关.

如果您有一个接口,该接口 return 是对对象的引用,那么该接口是指存在于程序中某处的对象。如果在尝试生成此类引用的过程中,您意识到用户的输入格式不正确或不存在此类对象,您有以下选择:

  1. 抛出异常。这通常是我们识别函数用户做错事的情况,他们要求的是不存在的东西。

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

在任何情况下,几乎没有理由显式地 return 从任何 API 到 unique_ptr 的左值引用。 unique_ptr代表所有权,如果一个API直接显示一个,它应该代表一个转移的所有权从源到目的地。 return 对 unique_ptr 的右值引用的函数意味着它赋予调用者所指向对象的所有权。

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

请注意,知道它包含一个unique_ptr的容器和碰巧的容器是有区别的] 包含一个 unique_ptrvector<T> 是一个广义数组,所以 operator[] return 是一个 T& 这一事实是可以的,即使 T 恰好是 unique_ptr。容器的用户知道 T 的含义以及如何使用它。

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