4.3.3 操作函数
optional的模板类型参数T可以是任何类型,就如同一个标准容器对元素的要求,并不需要T具有缺省构造函数,但必须是可拷贝构造的。
可以有很多方式创建optional对象,例如:
无参的optional()或者optional(boost::none)构造一个未初始化optional对象。参数boost::none是一个类似空指针的none_t类型常量,表示未初始化;
optional(v)构造一个已初始化的optional对象,其值为v的拷贝。如果模板类型为T&,那么optional内部持有对引用的包装;
optional(condition,v )根据条件condition来构造optional对象,如果条件成立(true)则初始化为v,否则为未初始化;
此外optional还支持拷贝构造和赋值操作,可以从另一个optional对象构造。当想让一个optional对象重新恢复到未初始化状态时,可以向对象赋none值。
optional采用了指针语义来访问内部保存的元素,这使得optional未初始化时的行为就像一个空指针。它重载了operator*和operator->以实现与指针相同的操作,get()和get_ptr()可以以函数的操作形式获得元素的引用和指针。
成员函数get_value_or(default)是一个特别的访问函数,可以保证返回一个有效的值,如果optional已初始化,那么返回内部的元素,否则返回default。
optional也可以用隐式类型转换进行bool测试(用于条件判断),就像一个对指针的判断。
optional还全面支持比较运算,包括==、!=、<、<、>、>=。与普通指针比较的"浅比较"(仅比较指针值)不同,optional的比较是"深比较",同时加入了对未初始化情况的判断。