定义:
类模板 std::optional 管理一个可选的容纳值,既可以存在也可以不存在的值。
在C/C++中,非指针如何表示一个空值。举一个例子,一函数用来创建一个类对象,如果它没有成功返回什么?像这种情况的解决办法,一般是搞这个bool值用来看是否执行成功,再来拿取对象;或者搞个魔数1,2,3等等来判断,原理都是一样。更或者,可以采用异常处理的方式,这个在c++里就有些惨不忍睹了。前者代码丑陋,后者是犯不着这么大费周章。
那有没有一个类似于nullptr的东西呢?有,std::nullopt_t ,它是空类类型,用于指示 optional 类型拥有未初始化状态。特别是 std::optional 有一个以 nullopt_t 为单参数的构造函数,它创建不含值的 optional 。
std::optional在确定有值的情况并不会分配内存而只是使用存在值的内存。注意,它模拟了一个对象而不是一个指针。
应用场景:
凡是取对象变量的地方都可以用它来替换,它基本解决了对变量处理空值的问题。
尤其是对于一些库的对外接口,不需要再处理空值异常的状态信息,可以在库外调用者直接处理,代码会更简单明了,处理异常更清晰便捷。
总结:
std::optional是一个和类型, 区别于struct所表达的积类型。
std::variant 表示要么有(要么是这个,要么是那个),std::optional表示可能有(可能有,也可能没有)。