@@ -3771,13 +3771,16 @@ namespace ranges {
3771
3771
}
3772
3772
3773
3773
_NODISCARD constexpr decltype(auto) operator*() const
3774
- noexcept(noexcept(_STD get<_Index>(*_Current))) /* strengthened */ {
3775
- if constexpr (is_reference_v<range_reference_t<_Base>>) {
3776
- return _STD get<_Index>(*_Current);
3777
- } else {
3778
- using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3779
- return static_cast<_ElemTy>(_STD get<_Index>(*_Current));
3780
- }
3774
+ noexcept(noexcept(_STD get<_Index>(*_Current))) /* strengthened */
3775
+ requires is_reference_v<range_reference_t<_Base>> {
3776
+ return _STD get<_Index>(*_Current);
3777
+ }
3778
+
3779
+ _NODISCARD constexpr decltype(auto) operator*() const noexcept(
3780
+ is_nothrow_move_constructible_v<remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>> //
3781
+ && noexcept(_STD get<_Index>(*_Current))) /* strengthened */ {
3782
+ using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3783
+ return static_cast<_ElemTy>(_STD get<_Index>(*_Current));
3781
3784
}
3782
3785
3783
3786
constexpr _Iterator& operator++() noexcept(noexcept(++_Current)) /* strengthened */ {
@@ -3840,16 +3843,22 @@ namespace ranges {
3840
3843
3841
3844
_NODISCARD constexpr decltype(auto) operator[](const difference_type _Idx) const
3842
3845
noexcept(noexcept(_STD get<_Index>(*(_Current + _Idx)))) /* strengthened */
3846
+ requires random_access_range<_Base>&& is_reference_v<range_reference_t<_Base>> {
3847
+ #if _ITERATOR_DEBUG_LEVEL != 0
3848
+ _Verify_offset(_Idx);
3849
+ #endif // _ITERATOR_DEBUG_LEVEL != 0
3850
+ return _STD get<_Index>(*(_Current + _Idx));
3851
+ }
3852
+
3853
+ _NODISCARD constexpr decltype(auto) operator[](const difference_type _Idx) const noexcept(
3854
+ is_nothrow_move_constructible_v<remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>> //
3855
+ && noexcept(_STD get<_Index>(*(_Current + _Idx)))) /* strengthened */
3843
3856
requires random_access_range<_Base> {
3844
3857
#if _ITERATOR_DEBUG_LEVEL != 0
3845
3858
_Verify_offset(_Idx);
3846
3859
#endif // _ITERATOR_DEBUG_LEVEL != 0
3847
- if constexpr (is_reference_v<range_reference_t<_Base>>) {
3848
- return _STD get<_Index>(*(_Current + _Idx));
3849
- } else {
3850
- using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3851
- return static_cast<_ElemTy>(_STD get<_Index>(*(_Current + _Idx)));
3852
- }
3860
+ using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3861
+ return static_cast<_ElemTy>(_STD get<_Index>(*(_Current + _Idx)));
3853
3862
}
3854
3863
3855
3864
_NODISCARD friend constexpr bool operator==(const _Iterator& _Left, const _Iterator& _Right) noexcept(
0 commit comments