Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

異常安全性保證

由於當前的實現(請見 實現說明),所有賦值方法:

不提供任何超過 T::operator=( T const& ) 所提供的異常安全性保證

只能保證基本的異常安全性:如果有異常被拋出,則左值 optional 將保持為 未初始化 (原來的值會首先T::~T() 銷毀)。

另一方面,去初始化方法:

提供了無拋出保證(假定 T::~T() 是無拋出的)。

不過,由於 optional<> 本身不拋出任何異常,所以在這裡異常的唯一來源是 T 的構造函數,如果你知道 T::T ( T const& ) 的異常安全性保證,那麼你就可以知道 optional 的賦值和重置都具有相同的保證。

//
// Case 1: 在賦值時拋出異常。
//
T v0(123); optional<T> opt0(v0); try { T v1(456); optional<T> opt1(v1); opt0 = opt1 ; // 如果沒有異常拋出,則賦值成功。
assert( *opt0 == v1 ) ; } catch(...) { // 如果有任何異常拋出,則 'opt0' 被重置為未初始化。
assert( !opt0 ) ; } //
// Case 2: 在 reset(v) 時拋出異常
//
T v0(123); optional<T> opt(v0); try { T v1(456); opt.reset ( v1 ) ; // 如果沒有異常拋出,則重置成功。
assert( *opt == v1 ) ; } catch(...) { // 如果有任何異常拋出,則 'opt' 被重置為未初始化。
assert( !opt ) ; }

交換

void swap( optional<T>&, optional<T>& ) 在兩個 optional 均已初始化時,具有與 swap(T&,T&) 相同的異常保證。如果只有一個 optional 是已初始化的,則它提供與 optional<T>::reset( T const& ) 一樣的基本異常保證(因為 optional<T>::reset( T const& ) 不會拋出)。如果兩個 optional 均未初始化,則它具有無拋出保證,因為這是一個空操作。


PrevUpHomeNext