@@ -629,26 +629,39 @@ public:
629
629
// [optional.iterators], iterator support
630
630
_LIBCPP_HIDE_FROM_ABI constexpr iterator begin () noexcept {
631
631
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
+
632
639
# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
633
640
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 )));
637
644
# else
638
- return iterator (std::addressof (__derived_self. __get ()) );
645
+ return iterator (__ptr );
639
646
# endif
640
647
}
641
648
642
649
_LIBCPP_HIDE_FROM_ABI constexpr const_iterator begin () const noexcept {
643
650
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
+
644
658
# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
645
659
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 )));
650
663
# else
651
- return const_iterator (std::addressof (__derived_self. __get ()) );
664
+ return const_iterator (__ptr );
652
665
# endif
653
666
}
654
667
0 commit comments