我有一个将 const ref 返回到 std::unique_ptr 的函数。我从某个容器中得到这个 ptr。当我的 std::unique_ptr 容器中没有输入值的适当对象时,我希望有可能返回 nullptr 或其他东西。 const ref 似乎是不可能的。肯定有返回 const 原始指针的选项,但如果可能的话,我想坚持使用 std::unique_ptr。
答案 0 :(得分: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 应该认识到这一事实。
答案 1 :(得分:1)
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
中的值无关。< /p>