【发布时间】:2021-12-18 15:26:21
【问题描述】:
我在互联网上看了几部在线 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 的优点/缺点是什么(nullopt 优于 nullptr)?
【问题讨论】:
-
所以,为了返回一个 ponter,实际上不需要将它包装到 std::optional 因为你有
nullptr。但是,如果您返回一些没有“空”状态的对象或值,std::optional会非常有用。 -
案例2有更多的空值,它同时支持
nullptr和std::nullopt,更多的选择:)。更常见的是使用std::optional<SomePointer>,而不使用*。 -
顺便说一句,
const_cast非常粗略。 -
带有
std::optional<SomePointer*>,它有三种状态:有一个有效的指针,有一个nullptr,有一个std::nullopt。您的代码小心地返回有效指针或std::nullopt...但调用者或此后的代码仍应警惕“永远不会发生”nullptr的可能性。 (嗯,可能有一个悬空指针,或者一个野指针,或者未初始化的指针......我忽略了这些场景。) -
为了您的考虑,返回
std::optional<std::reference_wrapper<SomePointer>>,它完全避免了nullptr状态,并且仍然具有打包行为,并且是自记录代码。 (SomePointer 的名字可能很糟糕,因为我认为它不是指针。)
标签: c++ stdoptional