![]() |
![]() ![]() ![]() ![]() |
![]() |
Detailed Semantics - Optional ValuesBoost , Boost.Optional , Header <boost/optional/optional.hpp>
|
![]() |
Note |
|---|---|
Следующий раздел содержит различные< |

<
optional<T>::optional() noexcept;>
optional>.*this>являетсянеинициализированным.optional<T>def; assert(!def);>

<
optional<T>::optional( none_t) noexcept;>
optional>.*this>являетсянеинициализированным.T>Конструктор по умолчаниюне называется. Выражение<boost::none>обозначает экземпляр<boost::none_t>, который может использоваться в качестве параметра.#include<boost/none.hpp> optional<T>n(none); assert(!n);>

<
optional<T>::optional( Tconst&v)>
is_copy_constructible<T>::value><true>.optional>.*this>инициализированои его значение составляеткопия<v>.T::T(Tconst&
)>.T::T(Tconst&
)>называется.T::T(Tconst&
);>в этом случае этот конструктор не имеет никакого эффекта.Tv; optional<T>opt(v); assert(*opt==v);>

<
optional<T>::optional( T&& v)>
is_move_constructible<T>::value><true>.optional>.*this>являетсяинициализированным, и его значение выводится из<v>.T::T(T&&)>.T::T(T&&)>называется.T::T(T&&);>в этом случае, состояние<v>определяется гарантиями безопасности исключения для<T::T(T&&)>.Tv1,v2; optional<T>opt(std::move(v1)); assert(*opt==v2);>

<
optional<T>::optional( boolcondition,Tconst&v);>
<
optional<T>::optional( Tconst&v)>
<
optional<T>::optional()>

<
optional<T>::optional( optionalconst&rhs );>
is_copy_constructible<T>::value><true>.optional>.*this>инициализируется и его значение составляеткопиязначения<rhs>; в противном случае<*this>неинициализируется.T::T(Tconst&
)>.T::T(Tconst&)>называется.T::T(Tconst&
);>в этом случае этот конструктор не имеет никакого эффекта.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&& rhs) noexcept(>смотрите ниже<);>
is_move_constructible<T>::value><true>.optional>.rhs>инициализировано,<*this>инициализируется и его значение перемещается из<rhs>; в противном случае<*this>является неинициализированным.T::T(T&&)>.noexcept>эквивалентно<is_nothrow_move_constructible<T>::value>.rhs>инициализировано,<T::T(T&&
)>называется.T::T(T&&);>, в этом случае<rhs>остается инициализированным, а значение<*rhs>определяется безопасностью исключения<T::T(T&&)>.optional<std::unique_ptr<T>>uninit; assert(!uninit); optional<std::unique_ptr<T>>uinit2(std::move(uninit)); assert(uninit2==uninit); optional<std::unique_ptr<T>>init(std::uniqye_ptr<T>(newT(2))); assert(**init==T(2)); optional<std::unique_ptr<T>>init2(std::move(init)); assert(init); assert(*init==nullptr); assert(init2); assert(**init2==T(2));>

<
template<U>explicitoptional<T>::optional(optional<U>const&rhs );>
optional>.rhs>инициализировано,<*this>инициализируется и его значение представляет собойкопиюзначения rhs, преобразованного в тип<T>; другое<*this>является неинициализированным.T::T(Uconst&
)>бросает.T::T(Uconst&
)>вызывается, если<rhs>инициализируется, что требует действительного преобразования из<U>в<T>.T::T(Uconst&
);>, в этом случае этот конструктор не имеет эффекта.optional<double>x(123.4); assert(*x==123.4); optional<int>y(x); assert(*y==123);>

<
template<U>explicitoptional<T>::optional(optional<U>&&rhs );>
optional>.rhs>инициализируется,<*this>инициализируется и его значение перемещается от<*rhs>; в противном случае<*this>неинициализируется.T::T(T&&)>.T::T(U&&)>вызывается, если<rhs>инициализируется, что требует действительного преобразования из<U>в<T>.T::T(U&&);>, в этом случае<rhs>остается инициализированным, а значение<*rhs>определяется гарантией безопасности исключения<T::T(U&&
)>.optional<double>x(123.4); assert(*x==123.4); optional<int>y(std::move(x)); assert(*y==123);>

<
template<InPlaceFactory> explicitoptional<T>::optional(InPlaceFactory const& f);>
<
template<TypedInPlaceFactory> explicitoptional<T>::optional(TypedInPlaceFactory const& f);>
optional>со стоимостью<T>, полученной с завода.*this>инициализированои его значениенепосредственно данос завода<f>(т.е. значениене скопировано).T>, вызванный заводом.T>, используемого заводом; в этом случае этот конструктор не имеет эффекта.classC{C(char,double,std::string);}; Cv('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>::operator=(none_t )noexcept;>
*this>инициализирован, то его содержащееся значение разрушается.*this>является неинициализированным.
<
optional& optional<T>::operator=(Tconst&rhs);>
rhs>на<optional>.*this>инициализируется и его значение составляеткопия<rhs>.T::operator=(Tconst&
)>или<T::T(Tconst&)>бросает.*this>было инициализировано,<T>используется оператор присвоения, в противном случае используется его копи-конструктор.*this>остается неизменным, а его значение не определено в отношении<optional>(до<T>'s<operator=()>). Если<*this>изначально неинициализирована и<T>копировальный конструкторвыходит из строя,<*this>остается должным образом неинициализированным.Tx; optional<T>def; optional<T>opt(x); Ty; def=y; assert(*def==y); opt=y; assert(*opt==y);>

<
optional& optional<T>::operator=(T&&rhs );>
rhs>на<optional>.*this>инициализируется и его значение перемещается из<rhs>.T::operator=(T&&)>или<T::T(T&&)>бросает.*this>был инициализирован,<T>используется оператор назначения движения, в противном случае используется его конструктор перемещения.*this>остается неизменным, а его значение не определено в отношении<optional>(до<T>'s<operator=()>). Если<*this>изначально неинициализировано и<T>движущийся конструкторвыходит из строя,<*this>остается должным образом неинициализированным.Tx; optional<T>def; optional<T>opt(x); Ty1,y2,yR; def=std::move(y1); assert(*def==yR); opt=std::move(y2); assert(*opt==yR);>

<
optional& optional<T>::operator=(optional const& rhs) ;>
T>является<CopyConstructible>и<CopyAssignable>.Эффекты:
*this>не содержит значенияrhs>содержит значение*rhs>содержащемуся значениюинициализирует содержащееся значение так, как если бы прямое инициализация объекта типа<T><*rhs>
*this>;bool(rhs)==bool(*this)>.*this>и<rhs>остается неизменным. Если во время вызова к конструктору копии<T>будет сделано исключение, никакого эффекта. Если во время запроса на уступку копии<T>было сделано исключение, то состояние ее содержащегося значения определяется гарантией безопасности исключения уступки копии<T>.Tv; optional<T>opt(v); optional<T>def; opt=def; assert(!def); // previous value (copy of 'v') destroyed from within 'opt'.>

<
optional& optional<T>::operator=(optional&&rhs )noexcept(>Смотрите ниже<);>
T><MoveConstructible>и<MoveAssignable>.Эффекты:
никакого эффекта[< val->T::~T()>
*this>;bool(rhs)==bool(*this)>.noexcept>эквивалентно<is_nothrow_move_constructible<T>::value&&
is_nothrow_move_assignable<T>::value>.*this>и<rhs>остается неизменным. Если во время вызова к<T>движущемуся конструктору выпадает исключение, то состояние<*rhs>определяется гарантией безопасности исключения<T>движущегося конструктора. Если во время призыва к назначению движения Т делается исключение, то состояние<**this>и<*rhs>определяется гарантией безопасности исключения назначения перемещения Т.optional<T>opt(T(2)); optional<T>def; opt=def; assert(def); assert(opt); assert(*opt==T(2));>

<
template<U>optional& optional<T>::operator=(optional<U>const&rhs );>
Эффект:
[7
< Эффект:*this>.bool(rhs)==bool(*this)>.bool(*this)>остается неизменным. Если во время вызова к конструктору<T>бросается исключение, никакого эффекта. Если во время вызова на уступку<T>выпадает исключение, то состояние его содержащегося значения определяется гарантией безопасности исключения уступки копии<T>.Tv;
optional<T>opt0(v);
optional<U>opt1;
opt1=opt0;
assert(*opt1==static_cast<U>(v));
>
template<U>optional&
optional<T>::operator=(optional<U>&&rhs
);>
rhs><rhs><rhs><rhs><rhs><rhs><rhs><std::move(*rhs)>придает содержащемуся значению<std::move(*rhs)>
инициализацию содержащегося значения, как если бы прямое инициализация объекта типа<T><std::move(*rhs)>
val->T::~T()>никакого эффекта
*this>.bool(rhs)==bool(*this)>.bool(*this)>остается неизменным. Если во время вызова к конструктору<T>бросается исключение, никакого эффекта. Если во время вызова на уступку<T>выпадает исключение, то состояние его содержащегося значения определяется гарантией безопасности исключения уступки копии<T>.Tv; optional<T>opt0(v); optional<U>opt1; opt1=std::move(opt0); assert(opt0); assert(opt1) assert(*opt1==static_cast<U>(v));>

<
template<class...Args> voidoptional<T>::emplace(Args&&...args );>
*this>- инициализированные вызовы<*this=none>. Затем инициализирует на месте содержащееся значение, как будто непосредственно инициализирует объект типа<T>с<std::forward<Args>(args)...>.*this>являетсяинициализированным.T>конструктор.T>выбрасывается исключение,<*this>являетсянеинициализированным.T>не обязательно<MoveConstructible>или<MoveAssignable>. На компиляторах, не поддерживающих вариадные шаблоны, подпись возвращается к двум перегрузкам:<template<class
Arg>
voidemplace(Arg&&arg)>и<void
emplace()>. На компиляторах, которые не поддерживают ссылки на значение r, подпись возвращается к трем перегрузкам: взятию ссылки<const>и ссылки не на<const>lvalue и третьему с пустым списком аргументов функции.Tv; optional<constT>opt; opt.emplace(0);// create in-place using ctor T(int) opt.emplace(); // destroy previous and default-construct another T opt.emplace(v);// destroy and copy-construct in-place (no assignment called)>

<
template<InPlaceFactory> optional<T>& optional<T>::operator=(InPlaceFactoryconst&f);>
<
template<TypedInPlaceFactory> optional<T>& optional<T>::operator=(TypedInPlaceFactoryconst&f);>
optional>со значением<T>, полученным с завода.*this>инициализированои его значениенепосредственно данос завода<f>(т.е. значениене скопировано).T>, вызванный заводом.T>, используемого заводом; в этом случае объект<optional>будет сброшен на.неинициализированный.
<
voidoptional<T>::reset(Tconst&v);>
operator=
(T
const&
v)
;>
<
voidoptional<T>::reset()noexcept ;>
operator=(
none_t);>
<
Tconst&optional<T>::get()const;>
<
T& optional<T>::get();>
<
inlineT const& get( optional<T>const&);>
<
inlineT&get (optional<T>&) ;>
*this>BOOST_ASSERT()>.
<
Tconst&optional<T>::operator*()const&;>
<
T& optional<T>::operator*() &;>
*this>BOOST_ASSERT()>. На компиляторах, не поддерживающих ref-квалификаторы функций-членов, эти две перегрузки заменяются классическими двумя: a<const>и non-<const>функциями-членами.Tv; optional<T>opt(v); Tconst&u=*opt; assert(u==v); Tw; *opt=w; assert(*opt==w);>

<
T&& optional<T>::operator*() &&;>
*this>содержит значение.returnstd::move(*val);>.BOOST_ASSERT()>. На компиляторах, не поддерживающих ref-квалификаторы на функциях-членах эта перегрузка отсутствует.
<
Tconst&optional<T>::value()const&;>
<
T& optional<T>::value()&;>
returnbool(*this)?*val:throwbad_optional_access();>.const>и non-<const>.Tv; optional<T>o0,o1(v); assert(o1.value()==v); try{ o0.value();// throws assert(false); } catch(bad_optional_access&){ assert(true); }>

<
T&& optional<T>::value()&&;>
returnbool(*this)?std::move(*val):throwbad_optional_access();>.
<
template<classU>Toptional<T>::value_or(U&& v) const& ;>
if(*this)return**this;elsereturn
std::forward<U>(v);>.T>не является<CopyConstructible>или<U&&>не является конвертируемым в<T>, программа плохо сформирована.const>-квалифицированную функцию-члена. На компиляторах без ссылочной поддержки rvalue тип<v>становится<Uconst&>.
<
template<classU>Toptional<T>::value_or(U&& v) &&;>
if(*this)returnstd::move(**this);elsereturnstd::forward<U>(v);>.T>не является<MoveConstructible>или<U&&>не конвертируется в<T>, программа плохо сформирована.
<
template<classF>Toptional<T>::value_or_eval(Ff)const&;>
T>является<CopyConstructible>и<F>модели<Generator>, чей тип результата преобразуется в<T>.if
(*this)return**this;elsereturnf();>.const>-квалифицированную функцию-члена.intcomplain_and_0() { clog<<"no value returned, using default"<<endl; return0; } optional<int>o1=1; optional<int>oN=none; inti=o1.value_or_eval(complain_and_0);// fun not called assert(i==1); intj=oN.value_or_eval(complain_and_0);// fun called assert(i==0);>

<
template<classF>Toptional<T>::value_or_eval(Ff)&& ;>
T>—<MoveConstructible>и<F>модели a<Generator>, чей тип результата преобразуется в<T>.if
(*this)returnstd::move(**this);elsereturn
f();>.
<
Tconst&optional<T>::get_value_or(Tconst&default)const;>
<
T& optional<T>::get_value_or( T& default) ;>
value_or()>.default>.Tv,z; optional<T>def; Tconst&y=def.get_value_or(z); assert(y==z); optional<T>opt(v); Tconst&u=opt.get_value_or(z); assert(u==v); assert(u!=z);>

<
Tconst*optional<T>::get_ptr()const;>
<
T* optional<T>::get_ptr() ;>
*this>инициализировано, указатель на содержащееся значение; другое<0>нуль.*this>, поэтому вы не должны удерживать или удалять этот указатель.Tv; optional<T>opt(v); optional<T>constcopt(v); T*p=opt.get_ptr(); Tconst*cp=copt.get_ptr(); assert(p==get_pointer(opt)); assert(cp==get_pointer(copt));>

<
Tconst*optional<T>::operator ->()const ;>
<
T* optional<T>::operator->() ;>
*this>инициализируется.BOOST_ASSERT()>.structX{intmdata;}; Xx; optional<X>opt(x); opt->mdata=2;>

<
explicitoptional<T>::operator bool() constnoexcept ;>
get_ptr()!=0>.optional<T>def; assert(def==0); optional<T>opt(v); assert(opt); assert(opt!=0);>

<
booloptional<T>::operator!()noexcept ;>
*this>является неинициализированным,<true>, то<false>.optional<T>opt; assert(!opt); *opt=some_T; // Notice the "double-bang" idiom here. assert(!!opt);>

<
booloptional<T>::is_initialized()const;>
explicitoperator
bool()
;>Статья Detailed Semantics - Optional Values раздела Boost.Optional Header <boost/optional/optional.hpp> может быть полезна для разработчиков на c++ и boost.
:: Главная :: Header <boost/optional/optional.hpp> ::
реклама |