![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
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> ::
реклама |