4.3.6 高级议题
本节讨论关于optional的一些高级议题。
异常
optional<T>同STL容器一样,只提供基本的异常保证,不会超过被包装的类型T,它自身不抛出任何异常,只有在T构造时可能会抛出异常。
就地创建
optional<T>要求类型T具有拷贝语义,因为它内部会保存值的拷贝,但很多时候复杂对象的拷贝代价很高,而且这个值仅仅作为拷贝的临时用途,是一种浪费。因此optional库提出了"就地创建"的概念,可以不要求类型具有拷贝语义,直接用构造函数所需的参数创建对象。这导致发展出了另一个Boost库--in_place_factory。
in_place_factory库本书不作详细介绍,示范in_place()用于optional用法的代码如下:
- #include <boost/optional.hpp>
- #include <boost/utility/in_place_factory.hpp>
- using namespace boost;
- int main()
- {
-
- //就地创建string对象,不需要临时对象string("....")
- optional<string> ops(in_place("test in_place_factory"));
- cout << *ops;
-
- //就地创建std::vecotr对象,不需要临时对象vector(10,3)
- optional<vector<int> > opp(in_place(10, 3));
- assert(opp->size() == 10);
- assert((*opp)[0] == 3);
- }
引用类型
optional的模板参数类型可以是引用(T&),它在很多方面与原始类型T有不同,比如无法使用就地创建、就地赋值。与C++(www.cppentry.com)语言内置的引用类型不同的是,它可以声明时不指定初值,并且在赋值时转移包装的对象,而不是对原包装的对象赋值。