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*>;
使其更加明确。
我在网上看了几部 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*>;
使其更加明确。