![]() |
Home | Libraries | People | FAQ | More |
由於當前的實現(請見 實現說明),所有賦值方法:
optional<T>::operator= ( optional<T>
const&
)optional<T>::operator= ( T const& )template<class U> optional<T>::operator= ( optional<U>
const&
)template<class InPlaceFactory> optional<T>::operator= ( InPlaceFactory
const&
)template<class TypedInPlaceFactory> optional<T>::operator= ( TypedInPlaceFactory
const&
) optional<T>:::reset ( T const&)不提供任何超過 T::operator=( T const& ) 所提供的異常安全性保證。
只能保證基本的異常安全性:如果有異常被拋出,則左值 optional 將保持為 未初始化
(原來的值會首先用 T::~T() 銷毀)。
另一方面,去初始化方法:
optional<T>::operator= ( detail::none_t )optional<T>::reset()提供了無拋出保證(假定 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
均未初始化,則它具有無拋出保證,因為這是一個空操作。