#include #include #if REVISION == 0 // Pre-a3942b3 layout. #define NO_REMOVE_CV #endif // REVISION == 1: current layout namespace std { namespace __lldb { struct in_place_t { explicit in_place_t() = default; }; constexpr in_place_t in_place{}; template ::value> struct __optional_destruct_base { typedef _Tp value_type; union { char __null_state_; #ifdef NO_REMOVE_CV value_type __val_; #else // !NO_REMOVE_CV remove_cv_t __val_; #endif }; bool __engaged_; template constexpr explicit __optional_destruct_base(in_place_t, _Args &&...__args) : __val_(std::forward<_Args>(__args)...), __engaged_(true) {} }; template ::value> struct __optional_storage_base : __optional_destruct_base<_Tp> { using __base = __optional_destruct_base<_Tp>; using value_type = _Tp; using __base::__base; }; template ::value> struct __optional_copy_base : __optional_storage_base<_Tp> { using __optional_storage_base<_Tp>::__optional_storage_base; }; template ::value> struct __optional_move_base : __optional_copy_base<_Tp> { using __optional_copy_base<_Tp>::__optional_copy_base; }; template ::value && is_trivially_copy_constructible<_Tp>::value && is_trivially_copy_assignable<_Tp>::value> struct __optional_copy_assign_base : __optional_move_base<_Tp> { using __optional_move_base<_Tp>::__optional_move_base; }; template ::value && is_trivially_move_constructible<_Tp>::value && is_trivially_move_assignable<_Tp>::value> struct __optional_move_assign_base : __optional_copy_assign_base<_Tp> { using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base; }; template struct __sfinae_ctor_base {}; template using __optional_sfinae_ctor_base_t = __sfinae_ctor_base::value, is_move_constructible<_Tp>::value>; template struct __sfinae_assign_base {}; template using __optional_sfinae_assign_base_t = __sfinae_assign_base< (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value), (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value)>; template class optional : private __optional_move_assign_base<_Tp>, private __optional_sfinae_ctor_base_t<_Tp>, private __optional_sfinae_assign_base_t<_Tp> { using __base = __optional_move_assign_base<_Tp>; public: using value_type = _Tp; public: template constexpr explicit optional(_Up &&__v) : __base(in_place, std::forward<_Up>(__v)) {} }; } // namespace __lldb } // namespace std int main() { std::__lldb::optional maybe_string{"Hello"}; std::__lldb::optional maybe_int{42}; return 0; // Break here }