std::optional 介绍

Optionals(也称为 Maybe 类型)用于表示其内容可能存在或不存在的类型。它们在 C++ 17 中实现为 std::optional 类。例如,std::optional<int> 类型的对象可能包含某些 int 类型的值,或者它可能不包含任何值。

Optionals 通常用于表示可能不存在的值,或者作为无法返回有意义结果的函数的返回类型。

其他可选方法

解决 std::optional 解决的问题有很多其他方法,但它们都不完全:使用指针,使用哨兵或使用 pair<bool, T>

可选 vs 指针

在某些情况下,我们可以提供指向现有对象或 nullptr 的指针来指示失败。但这仅限于已存在对象的情况 - 作为值类型的 optional 也可用于返回新对象而无需借助内存分配。

可选 vs Sentinel

常用的习惯用法是使用特殊值来表示该值无意义。对于整数类型,这可以是 0 或 -1,对于指针,这可以是 nullptr。但是,这会减少有效值的空间(你无法区分有效值 0 和无意义 0),并且许多类型对于标记值没有自然选择。

可选 vs std::pair<bool, T>

另一个常见的习语是提供一对,其中一个元素是 bool,表示该值是否有意义。

这依赖于在错误的情况下默认可构造的值类型,这对于某些类型是不可能的并且可能但对于其他类型是不可取的。如果出错,则 optional<T> 不需要构造任何东西。