4.3 optional
optional库使用"容器"语义,包装了"可能产生无效值"的对象,实现了"未初始化"的概念。
optional位于名字空间boost,为了使用optional,需要包含头文件<boost/optional. hpp>,即:
- #include <boost/optional.hpp>
- using namespace boost;
4.3.1 "无意义"的值
函数并不是总能返回有效的返回值,很多时候函数可能返回"无意义"的值,这不意味着函数执行失败,而是表明函数正确执行了,但结果却不是有用的值。如果用数学语言来解释,就是返回值位于函数解空间之外。
例如,求一个数的倒数,在实数域内开平方,在字符串中查找子串,它们都可能返回无效的值。有些无效返回的情况可以用抛出异常的方式来通知用户,但有的情况下这样代价很高,或者不允许异常,这时必须要以某种合理的高效的方式通知用户。
表示返回值无意义最常用的做法是增加一个"哨兵"的角色,它位于解空间之外,如NULL、-1、EOF、string::npos、vector::end()等。但这些做法不够通用,而且很多时候不存在解空间之外的"哨兵"。
optional使用"容器"语义,为这种"无效值"的情形提供了一个较好的解决方案。