![]() |
Home | Libraries | People | FAQ | More |
因為 T
可能是引用類型,所以,那些語義與 T
的類型是否為引用相關的項,將使用以下約定:
optional<T(not a ref)>,
則對應的描述僅適作於T不是引用類型時的情況。 optional<T&>,
則對應的描述僅適用於T是引用類型時的情況。 optional<T>,
則對應的描述適用於兩種情況。 ![]() |
說明 |
|---|---|
|
以下章節中包含多個 |
optional<T>::optional();
optional. *this
為 未初始化的。 optional<T> def ;
assert ( !def ) ;
optional<T>::optional( none_t );
optional. *this 為 未初始化的。 T 的缺省構造函數未被調用。表達式 boost::none 表示一個 boost::none_t 實例,可用作本構造函數的參數。 #include <boost/none.hpp>
optional<T> n(none) ;
assert ( !n ) ;
optional<T(not a ref)>::optional( T const& v )
optional. *this 為 已初始化的,它的值為 v 的拷貝。
T::T(
T const&
) 所拋出的任何異常。 T::T( T
const& ). T::T(
T const&
); 中拋出異常,這時構造函數無效。 T v;
optional<T> opt(v);
assert ( *opt == v ) ;
optional<T&>::optional( T& ref )
optional. *this 為 已初始化的,它的值為某個內部類型的實例,包裝了引用 ref.
T v;
T& vref = v ;
optional<T&> opt(vref);
assert ( *opt == v ) ;
++ v ; // mutate referee
assert (*opt == v);
optional<T(not a ref)>::optional( bool condition, T const& v ) ;
optional<T&> ::optional( bool condition, T& v ) ;
true, 則相當於:
optional<T(not a ref)>::optional( T const& v )
optional<T&> ::optional( T& v )
optional<T [#(not a ref)]>::optional()
optional<T&> ::optional()
optional<T(not a ref)>::optional( optional const& rhs );
optional. *this 為已初始化的,且值為 rhs 的值的拷貝;否則 *this 為未初始化的。 T::T(
T const&
) 所拋出的任何異常。 T::T(T const& ) . T::T(
T const&
); 中拋出異常,這時構造函數無效。 optional<T> uninit ;
assert (!uninit);
optional<T> uinit2 ( uninit ) ;
assert ( uninit2 == uninit );
optional<T> init( T(2) );
assert ( *init == T(2) ) ;
optional<T> init2 ( init ) ;
assert ( init2 == init ) ;
optional<T&>::optional( optional const& rhs );
optional. *this 為已初始化的,且值為 *rhs
所引用的同一個對象的另一個引用;否則 *this 為未初始化的。 *this 與 *rhs 均引向同一個對像(它們互為別名)。 optional<T&> uninit ;
assert (!uninit);
optional<T&> uinit2 ( uninit ) ;
assert ( uninit2 == uninit );
T v = 2 ; T& ref = v ;
optional<T> init(ref);
assert ( *init == v ) ;
optional<T> init2 ( init ) ;
assert ( *init2 == v ) ;
v = 3 ;
assert ( *init == 3 ) ;
assert ( *init2 == 3 ) ;
template<U> explicit optional<T(not a ref)>::optional( optional<U> const& rhs );
optional. *this 為已初始化的,且值為 rhs
轉換為類型T的值的拷貝;否則 *this 為未初始化的。 T::T(
U const&
) 所拋出的任何異常。 rhs 已初始化,則調用 T::T( U
const& ), 要求有從 U 到 T 的有效轉換。 T::T(
U const&
); 中拋出異常,這時構造函數無效。 optional<double> x(123.4);
assert ( *x == 123.4 ) ;
optional<int> y(x) ;
assert( *y == 123 ) ;
template<InPlaceFactory> explicit optional<T(not a ref)>::optional( InPlaceFactory const& f );
template<TypedInPlaceFactory> explicit optional<T(not a ref)>::optional( TypedInPlaceFactory const& f );
optional,T 的值從工廠獲得。 *this 已初始化 且其值直接由工廠 f 取得(即該值不是複製的)。
T 構造函數所拋出的任何異常。 class C { C ( char, double, std::string ) ; } ;
C v('A',123.4,"hello");
optional<C> x( in_place ('A', 123.4, "hello") ); // InPlaceFactory used
optional<C> y( in_place<C>('A', 123.4, "hello") ); // TypedInPlaceFactory used
assert ( *x == v ) ;
assert ( *y == v ) ;
optional& optional<T(not a ref)>::operator= ( T const& rhs ) ;
rhs 賦給一個 optional.
*this 為已初始化的,其值為 rhs 的拷貝。 T::operator=(
T const&
) 或 T::T(T
const&) 拋出的任何異常。
*this 是已初始化的,則使用 T 的賦值操作符,否則使用它的複製構造函數。 *this 的初始化狀態不會改變,它的值是不確定的直至 optional 被關聯(由 T 的 operator=() 進行)。如 **this 原來是未初始化的,且 T 的複製構造函數 失敗了,則 *this 仍為未初始化的。 T x;
optional<T> def ;
optional<T> opt(x) ;
T y;
def = y ;
assert ( *def == y ) ;
opt = y ;
assert ( *opt == y ) ;
optional<T&>& optional<T&>::operator= ( T& const& rhs ) ;
*this 已初始化且引向由 rhs 所引向的對象。
*this 已初始化,則重綁定到新的對象。有關細節請見 這裡。 int a = 1 ;
int b = 2 ;
T& ra = a ;
T& rb = b ;
optional<int&> def ;
optional<int&> opt(ra) ;
def = rb ; // 通過 'rb' 將 'def' 綁定到 'b'
assert ( *def == b ) ;
*def = a ; // 將 'b' 的值修改為 'a' 的值的拷貝
assert ( b == a ) ;
int c = 3;
int& rc = c ;
opt = rc ; // 通過 'rc' 綁定到 'c'
c = 4 ;
assert ( *opt == 4 ) ;
optional& optional<T(not a ref)>::operator= ( optional const& rhs ) ;
optional 賦值給一個 optional.
rhs 已初始化,則 *this 為已初始化且其值為 rhs 值的拷貝;否則 *this 為未初始化。 T::operator(
T const&) 或 T::T(
T const&
) 拋出的任何異常。 *this 和 rhs 均已初始化,則使用 T 的 賦值操作符。如果 *this 已初始化而 rhs 未初始化,則調用 T 的 析構函數。如果 *this 未初始化而 rhs 已初始化,則調用 T 的
複製構造函數。*this 的初始化狀態不改變,其值是不確定的直至 optional 被關聯(由 T 的 operator=() 進行) [如果 *this 原來是未初始化的而且 T 的 複製構造函數 失敗,則 *this 保持為未初始化]T v;
optional<T> opt(v);
optional<T> def ;
opt = def ;
assert ( !def ) ;
// 'opt'的原值('v'的拷貝)被銷毀
optional<T&> & optional<T&>::operator= ( optional<T&> const& rhs ) ;
*rhs 已初始化,則 *this 為已初始化的且引向且引向由 *rhs
所引向的對象;否則 *this 為未初始化(不引向任何對像)。 *this 已初始化且 *rhs 也是,則重綁定到新的對象。有關細節請見 這裡。int a = 1 ;
int b = 2 ;
T& ra = a ;
T& rb = b ;
optional<int&> def ;
optional<int&> ora(ra) ;
optional<int&> orb(rb) ;
def = orb ; // 通過'orb'中包裝的'rb'將'def'綁定到'b'
assert ( *def == b ) ;
*def = ora ; // 將'b'的值修改為'a'值的拷貝
assert ( b == a ) ;
int c = 3;
int& rc = c ;
optional<int&> orc(rc) ;
ora = orc ; // 通過'rc'將ora重綁定到'c'
c = 4 ;
assert ( *ora == 4 ) ;
template<U> optional& optional<T(not a ref)>::operator= ( optional<U> const& rhs ) ;
rhs 已初始化,則 *this 也是已初始化的,且其值為 rhs
轉換為類型 T 後的值的拷貝;否則 *this 為未初始化。 T::operator=(
U const&
) 或 T::T( U
const& ) 拋出的任何異常。 *this 和 rhs 均已初始化,則使用 T 的 賦值操作符 (from U)。如果
*this 已初始化而 rhs 未初始化,則調用 T 的 析構函數。如果 *this 未初始化而 rhs
已初始化,則調用 T 的 轉換構造函數 (從 U 轉換)。 *this 的初始化狀態不改變,其值是不確定的直至 optional 被關聯(由 T 的
operator=() 進行)。如果 *this 原來是未初始化的而且 T 的 轉換構造函數 失敗,則 *this
保持為未初始化。 T v;
optional<T> opt0(v);
optional<U> opt1;
opt1 = opt0 ;
assert ( *opt1 == static_cast<U>(v) ) ;
void optional<T(not a ref)>::reset( T const& v ) ;
operator=
( T const& v)
;
void optional<T>::reset() ;
operator=(
detail::none_t
);
T const& optional<T(not a ref)>::operator*() const ;
T& optional<T(not a ref)>::operator*();
T const& optional<T(not a ref)>::get() const ;
T& optional<T(not a ref)>::get() ;
inline T const& get ( optional<T(not a ref)> const& ) ;
inline T& get ( optional<T(not a ref)> &) ;
*this 已初始化。 BOOST_ASSERT() 對前提條件進行斷言。 T v ;
optional<T> opt ( v );
T const& u = *opt;
assert ( u == v ) ;
T w ;
*opt = w ;
assert ( *opt == w ) ;
T const& optional<T(not a ref)>::get_value_or( T const& default) const ;
T& optional<T(not a ref)>::get_value_or( T& default ) ;
inline T const& get_optional_value_or ( optional<T(not a ref)> const& o, T const& default ) ;
inline T& get_optional_value_or ( optional<T(not a ref)>& o, T& default ) ;
default.
T v, z ;
optional<T> def;
T const& y = def.get_value_or(z);
assert ( y == z ) ;
optional<T> opt ( v );
T const& u = get_optional_value_or(opt,z);
assert ( u == v ) ;
assert ( u != z ) ;
T const& optional<T&>::operator*() const ;
T & optional<T&>::operator*();
T const& optional<T&>::get() const ;
T& optional<T&>::get() ;
inline T const& get ( optional<T&> const& ) ;
inline T& get ( optional<T&> &) ;
*this 已初始化。 BOOST_ASSERT() 對前提條件進行斷言。 T v ;
T& vref = v ;
optional<T&> opt ( vref );
T const& vref2 = *opt;
assert ( vref2 == v ) ;
++ v ;
assert ( *opt == v ) ;
T const* optional<T(not a ref)>::get_ptr() const ;
T* optional<T(not a ref)>::get_ptr() ;
inline T const* get_pointer ( optional<T(not a ref)> const& ) ;
inline T* get_pointer ( optional<T(not a ref)> &) ;
*this 已初始化,則返回所含值的指針;否則返回 0 (null).
*this 永久保留,所以你不能持有或刪除該指針。 T v;
optional<T> opt(v);
optional<T> const copt(v);
T* p = opt.get_ptr() ;
T const* cp = copt.get_ptr();
assert ( p == get_pointer(opt) );
assert ( cp == get_pointer(copt) ) ;
T const* optional<T(not a ref)>::operator ->() const ;
T* optional<T(not a ref)>::operator ->() ;
*this 已初始化。 BOOST_ASSERT() 對前提條件進行斷言。 struct X { int mdata ; } ;
X x ;
optional<X> opt (x);
opt->mdata = 2 ;
optional<T>::operatorunspecified-bool-type() const ;
get()
!= 0) optional<T> def ;
assert ( def == 0 );
optional<T> opt ( v ) ;
assert ( opt );
assert ( opt != 0 );
bool optional<T>::operator!() ;
*this 未初始化,則返回 true; 否則返回 false.
optional<T> opt ;
assert ( !opt );
*opt = some_T ;
// 注意這裡的 "double-bang" 用法。
assert ( !!opt ) ;
bool optional<T>::is_initialized() const ;
true 如果 optional 已初始化,否則 false . optional<T> def ;
assert ( !def.is_initialized() );
optional<T> opt ( v ) ;
assert ( opt.is_initialized() );
optional<T(not a ref)> make_optional( T const& v )
optional<T>(v),從 v 推斷類型 T .
template<class T> void foo ( optional<T> const& opt ) ;
foo ( make_optional(1+1) ) ; // 創建一個 optional<int>
optional<T(not a ref)> make_optional( bool condition, T const& v )
optional<T>(condition,v),從 v 推斷類型 T .
optional<double> calculate_foo()
{
double val = compute_foo();
return make_optional(is_not_nan_and_finite(val),val);
}
optional<double> v = calculate_foo();
if ( !v )
error("foo wasn't computed");
bool operator == ( optional<T> const& x, optional<T> const& y );
x 和 y 均已初始化,則返回 (*x == *y). 如果只有 x 或 y
已初始化,則返回 false. 如果均未初始化,則返回 true. optional 是"深比較"的。不要在使用 optional<T>
或指針的泛型代碼中直接使用 operator
==;應使用 equal_pointees() 來替代。 T x(12);
T y(12);
T z(21);
optional<T> def0 ;
optional<T> def1 ;
optional<T> optX(x);
optional<T> optY(y);
optional<T> optZ(z);
// 總是保持同一性
assert ( def0 == def0 );
assert ( optX == optX );
// 未初始化的對象是相等的
assert ( def0 == def1 );
// 只有一個初始化對像則是不等的
assert ( def0 != optX );
// 已初始化的對象則要比較 (*lhs == *rhs)
assert ( optX == optY ) ;
assert ( optX != optZ ) ;
bool operator < ( optional<T> const& x, optional<T> const& y );
y 未初始化,則返回 false. 如果 y 已初始而 x 未初始化,則返回 true. 如果 x 和 y 均已初始化,則返回 (*x <
*y). optional 是"深比較"的。不要在使用 optional<T>
或指針的泛型代碼中直接使用 operator
<;應使用 less_pointees() 來替代。 T x(12);
T y(34);
optional<T> def ;
optional<T> optX(x);
optional<T> optY(y);
// 總是保持同一性
assert ( !(def < def) );
assert ( optX == optX );
// 兩個未初始化對象是相等的
assert ( def0 == def1 );
// 只有一個已初始化對像則是不等的
assert ( def0 != optX );
// 兩個已初始化對像則要比較 (*lhs == *rhs)
assert ( optX == optY ) ;
assert ( optX != optZ ) ;
bool operator != ( optional<T> const& x, optional<T> const& y );
!(
x == y
);
bool operator > ( optional<T> const& x, optional<T> const& y );
(
y < x );
bool operator <= ( optional<T> const& x, optional<T> const& y );
!(
y<x );
bool operator >= ( optional<T> const& x, optional<T> const& y );
!(
x<y );
void swap ( optional<T>& x, optional<T>& y );
x 和 y 均已初始化,則調用 swap(*x,*y),使用 std::swap. 如果只有一個已初始化,如 x, 則調用:y = *x; x =
boost:none;x 和 y 的狀態被交換。 swap(T&,T&) 所拋出的任何異常。如果只有一個已初始化,則拋出 T::T
( T const& ) 所拋出的任何異常。 swap(T&,T&),不過 std::swap
被引入到當前域中。如果只有一個已初始化,則調用 T::~T() 和 T::T(
T const&
) . swap(T&,T&) 的異常安全性保證。如果只有一個已初始化,則該操作具有和 optional<T>::reset(
T const&
) 一樣的基本保證。 T x(12);
T y(21);
optional<T> def0 ;
optional<T> def1 ;
optional<T> optX(x);
optional<T> optY(y);
boost::swap(def0,def1); // no-op
boost::swap(def0,optX);
assert ( *def0 == x );
assert ( !optX );
boost::swap(def0,optX); // Get back to original values
boost::swap(optX,optY);
assert ( *optX == y );
assert ( *optY == x );