230 "T in optional<T> cannot be a reference type (N4606 [optional.syn]/1).");
232 "T in optional<T> cannot be nullopt_t (N4606 [optional.syn]/1).");
234 "T in optional<T> cannot be in_place_t (N4606 [optional.syn]/1).");
236 "T in optional<T> must be an object type (N4606 [optional.object]/3).");
238 "T in optional<T> must satisfy the requirements of Destructible (N4606 [optional.object]/3).");
240 using value_type = _Ty;
252 template<
class... _Types,
254 constexpr
explicit optional(in_place_t, _Types&&... _Args)
259 template<
class _Elem,
272 template<
class _Ty2 = _Ty,
274 constexpr optional(_Ty2&&
_Right)
278 template<
class _Ty2 = _Ty,
280 constexpr
explicit optional(_Ty2&&
_Right)
286 struct _AllowUnwrapping
288 !(is_constructible_v<_Ty, optional<_Ty2>&>
289 || is_constructible_v<_Ty, const optional<_Ty2>&>
290 || is_constructible_v<_Ty, const optional<_Ty2>>
291 || is_constructible_v<_Ty, optional<_Ty2>>
292 || is_convertible_v<optional<_Ty2>&, _Ty>
293 || is_convertible_v<const optional<_Ty2>&, _Ty>
294 || is_convertible_v<const optional<_Ty2>, _Ty>
295 || is_convertible_v<optional<_Ty2>, _Ty>)>
301 _AllowUnwrapping<_Ty2>,
303 optional(
const optional<_Ty2>&
_Right)
307 this->_Construct(*_Right);
312 is_constructible<_Ty, const _Ty2&>,
313 _AllowUnwrapping<_Ty2>,
315 explicit optional(
const optional<_Ty2>& _Right)
319 this->_Construct(*_Right);
326 _AllowUnwrapping<_Ty2>,
328 optional(optional<_Ty2>&& _Right)
332 this->_Construct(
_STD move(*_Right));
337 is_constructible<_Ty, _Ty2>,
338 _AllowUnwrapping<_Ty2>,
340 explicit optional(optional<_Ty2>&& _Right)
344 this->_Construct(
_STD move(*_Right));
355 template<
class _Ty2 = _Ty,
360 is_constructible<_Ty, _Ty2>,
362 optional&
operator=(_Ty2&& _Right)
364 this->_Assign(
_STD forward<_Ty2>(_Right));
369 struct _AllowUnwrappingAssignment
371 !(is_assignable_v<_Ty&, optional<_Ty2>&>
372 || is_assignable_v<_Ty&, const optional<_Ty2>&>
373 || is_assignable_v<_Ty&, const optional<_Ty2>>
374 || is_assignable_v<_Ty&, optional<_Ty2>>)>
379 is_constructible<_Ty, const _Ty2&>,
381 _AllowUnwrappingAssignment<_Ty2>>::value>>
382 optional&
operator=(
const optional<_Ty2>& _Right)
386 this->_Assign(*_Right);
397 is_constructible<_Ty, _Ty2>,
399 _AllowUnwrappingAssignment<_Ty2>>::value>>
400 optional&
operator=(optional<_Ty2>&& _Right)
413 template<
class... _Types>
414 void emplace(_Types&&... _Args)
417 this->_Construct(
_STD forward<_Types>(_Args)...);
420 template<
class _Elem,
424 void emplace(initializer_list<_Elem> _Ilist, _Types&&... _Args)
427 this->_Construct(_Ilist,
_STD forward<_Types>(_Args)...);
431 void swap(optional& _Right)
435 "optional<T>::swap requires T to be move constructible (N4606 [optional.object.swap]/1).");
436 static_assert(is_swappable<_Ty>::value,
437 "optional<T>::swap requires T to be swappable (N4606 [optional.object.swap]/1).");
438 const bool _Engaged = has_value();
439 if (_Engaged == _Right.has_value())
449 optional&
_Target = *
this ? _Right : *
this;
450 _Target._Construct(
_STD move(*_Source));
456 constexpr
const _Ty * operator->()
const
477 constexpr
const _Ty&&
operator*() const &&
482 constexpr
explicit operator bool() const _NOEXCEPT
484 return (this->_Has_value);
486 constexpr
bool has_value() const _NOEXCEPT
488 return (this->_Has_value);
491 constexpr
const _Ty& value() const &
503 constexpr
const _Ty&& value() const &&
509 constexpr _Ty value_or(_Ty2&& _Right) const &
512 "The const overload of optional<T>::value_or requires T to be copy constructible "
513 "(N4606 [optional.object.observe]).");
515 "optional<T>::value_or(U) requires U to be convertible to T (N4606 [optional.object.observe]).");
516 return (*
this ? **
this : static_cast<_Ty>(
_STD forward<_Ty2>(_Right)));
522 "The rvalue overload of optional<T>::value_or requires T to be move constructible "
523 "(N4606 [optional.object.observe]).");
525 "optional<T>::value_or(U) requires U to be convertible to T (N4606 [optional.object.observe]).");
526 return (*
this ?
_STD move(**
this) : static_cast<_Ty>(
_STD forward<_Ty2>(_Right)));
#define _CONSTEXPR14
Definition: yvals.h:114
_Variant_copymove_layer_ & operator=(_Variant_copymove_layer_ &&_That) _NOEXCEPT_OP((conjunction< is_nothrow_move_constructible< _Types >...
Definition: type_traits:270
_STD_BEGIN constexpr _Ty * addressof(_Ty &_Val) _NOEXCEPT
Definition: xstddef:628
Definition: type_traits:591
std::enable_if< details::_Is_extent_or_index< _Tuple_type< _Rank > >::value, _Tuple_type< _Rank > >::type operator*(const _Tuple_type< _Rank > &_Lhs, typename _Tuple_type< _Rank >::value_type _Rhs) __GPU
Definition: amp.h:890
Definition: type_traits:598
#define _NOEXCEPT
Definition: yvals.h:84
Definition: type_traits:580
Definition: type_traits:415
#define _NOEXCEPT_OP(x)
Definition: yvals.h:85
Definition: xsmf_control.h:35
Definition: xsmf_control.h:19
_Source
Definition: corecrt_wstring.h:187
Definition: type_traits:1171
#define bool
Definition: stdbool.h:15
Definition: type_traits:404
#define _THROW_NCEE(x, y)
Definition: xstddef:51
Definition: type_traits:554
Definition: type_traits:620
Definition: type_traits:561
Definition: initializer_list:17
Definition: type_traits:444
Definition: type_traits:610
Definition: xsmf_control.h:67
#define _EMPTY_ARGUMENT
Definition: xstddef:77
void _Swap_adl(_Ty &_Left, _Ty &_Right) _NOEXCEPT_OP(_Is_nothrow_swappable< _Ty >
Definition: utility:73
_In_ _Value
Definition: corecrt_wstdlib.h:65
constexpr _Ty && forward(typename remove_reference< _Ty >::type &_Arg) _NOEXCEPT
Definition: type_traits:1332
Definition: type_traits:732
typename enable_if< _Test, _Ty >::type enable_if_t
Definition: type_traits:2099
typename remove_cv< _Ty >::type remove_cv_t
Definition: type_traits:2048
void swap(optional< _Ty > &_Left, optional< _Ty > &_Right) _NOEXCEPT_OP(_NOEXCEPT_OP(_Left.swap(_Right)))
Definition: optional:702
constexpr remove_reference< _Ty >::type && move(_Ty &&_Arg) _NOEXCEPT
Definition: type_traits:1349
Definition: xtr1common:87
const void * _Target(const type_info &_Info) const _NOEXCEPT
Definition: functional:408
Definition: xsmf_control.h:51
Definition: type_traits:315
constexpr const _Ty &() _Right
Definition: algorithm:3723
Definition: type_traits:1110