@@ -629,26 +629,39 @@ public:
629629 // [optional.iterators], iterator support
630630 _LIBCPP_HIDE_FROM_ABI constexpr iterator begin () noexcept {
631631 auto & __derived_self = static_cast <optional<_Tp>&>(*this );
632+ auto __ptr = [&__derived_self]() {
633+ if constexpr (is_lvalue_reference_v<_Tp>) {
634+ return __derived_self.has_value () ? std::addressof (__derived_self.__get ()) : nullptr ;
635+ }
636+ return std::addressof (__derived_self.__get ());
637+ }();
638+
632639# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
633640 return std::__make_bounded_iter (
634- std::__wrap_iter<__pointer>(std::addressof (__derived_self. __get ()) ),
635- std::__wrap_iter<__pointer>(std::addressof (__derived_self. __get ()) ),
636- std::__wrap_iter<__pointer>(std::addressof (__derived_self. __get () ) + (__derived_self.has_value () ? 1 : 0 )));
641+ std::__wrap_iter<__pointer>(__ptr ),
642+ std::__wrap_iter<__pointer>(__ptr ),
643+ std::__wrap_iter<__pointer>(__ptr ) + (__derived_self.has_value () ? 1 : 0 )));
637644# else
638- return iterator (std::addressof (__derived_self. __get ()) );
645+ return iterator (__ptr );
639646# endif
640647 }
641648
642649 _LIBCPP_HIDE_FROM_ABI constexpr const_iterator begin () const noexcept {
643650 auto & __derived_self = static_cast <const optional<_Tp>&>(*this );
651+ auto * __ptr = [&__derived_self]() {
652+ if constexpr (is_lvalue_reference_v<_Tp>) {
653+ return __derived_self.has_value () ? std::addressof (__derived_self.__get ()) : nullptr ;
654+ }
655+ return std::addressof (__derived_self.__get ());
656+ }();
657+
644658# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
645659 return std::__make_bounded_iter (
646- std::__wrap_iter<__const_pointer>(std::addressof (__derived_self.__get ())),
647- std::__wrap_iter<__const_pointer>(std::addressof (__derived_self.__get ())),
648- std::__wrap_iter<__const_pointer>(
649- std::addressof (__derived_self.__get ()) + (__derived_self.has_value () ? 1 : 0 )));
660+ std::__wrap_iter<__const_pointer>(__ptr),
661+ std::__wrap_iter<__const_pointer>(__ptr),
662+ std::__wrap_iter<__const_pointer>(__ptr) + (__derived_self.has_value () ? 1 : 0 )));
650663# else
651- return const_iterator (std::addressof (__derived_self. __get ()) );
664+ return const_iterator (__ptr );
652665# endif
653666 }
654667
0 commit comments