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>
不需要构造任何东西。