nullptr 上 std::optional 的 advantages/disadvantages 是什么?

What are the advantages/disadvantages of std::optional over nullptr?

我在网上看了几部 std::optional 纪录片。但是我无法找到以下两种情况之间的任何直接比较:

案例 1:

SomePointer* foo::get_some_pointer(cont int value) {
    
    auto result = myMap.find(value);

    if (result != myMap.end()) {
        return const_cast<SomePointer*>(&result->second);
    }

    return nullptr;
}

案例 2

 std::optional<SomePointer*> foo::get_some_pointer (cont int value) {
    
        auto result = myMap.find(value);
    
        if (result != myMap.end()) {
            return std::optional<SomePointer*>{&result->second};
        }
    
        return std::nullopt;
    }

案例 1 对案例 2 的 advantages/disadvantages 是什么(nullopt 对 nullptr)?

std::optional 的唯一工作是通过附加的“空”值扩展类型域。每个指针类型 T* 已经有一个被视为“空”的值 - nulltpr.

因此,直接比较这两者并不是一个好主意,因为它们回答的问题不同。有时区分“无结果”和“空结果”1(这是可能的解释之一)很重要,有时则不然。您应该使用适合您需要的任何一个。

现在,如果 代码 returned 指针的原因是利用隐式指针可空性,那么正确的解决方案是将其更改为return std::optional<SomePointer>(或者 std::optional<std::reference_wrapper<SomePointer>>),但这不是你问的。


1 当然在这一点上也值得考虑诸如struct NoResult {}; using Result = std::variant<NoResult, SomePointer*>; 使其更加明确。