API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?

Does it make sense for an API to return std::optional of a smart pointer to clearly specify that the pointer may be null?

本文关键字:指针 定指 null 有意义 是否 智能 返回 std optional API      更新时间:2023-10-16

C++有一个坏习惯,假设当你调用一个返回一些智能指针的函数时,你得到的值std::unique_ptr/std::shared_ptr你得到的值是"总是"不为空。

C++17引入了新的std::optional类,它非常清楚地表明该值实际上可能是空的。我了解std::optional值类型的优势。

所以我想知道 API 从设计角度返回智能指针的可选值是否有意义(其中nullptr是一个可能的返回值,这意味着对象可能不存在(?

假设我有一个类,其方法返回一些智能指针:

class MyClass
{
public:
std::optional<std::shared_ptr<SomeSharedObject>> GetSomething();
};

还是太过分了?

我想说这取决于函数在成功执行后返回nullptr是否有效/预期(可能是也可能不是,取决于这个函数应该做什么(。如果通过返回值处理错误是您想要执行的操作,那么使用std::optional来表示错误的发生可能是一种方法。但是,请注意,这样做将不允许您返回其他错误信息。如果函数应该在成功时返回对象的所有权,而其他任何内容都意味着失败,那么您可以使用nullptr状态来表示错误并节省std::optional的开销(它很小,但不是完全免费的,因为它必须跟踪和测试值是否存在(。同样,当然,不可能传递错误信息...