diff --git a/stl/inc/ranges b/stl/inc/ranges index 8317ea2604..7e42f98c7e 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -7140,14 +7140,23 @@ namespace ranges { return _Get_smallest_distance_closure(index_sequence_for<_LHSTupleTypes...>{}); } + // Work around C2382 when mixing #include with import std;: a noexcept fold expression prevents + // the compiler from matching the textual and module declarations, while a variable template is trivially matched. + template + inline constexpr bool _Zip_iterator_sentinel_equal_is_nothrow = false; + + template + inline constexpr bool _Zip_iterator_sentinel_equal_is_nothrow, tuple<_RHSTupleTypes...>> = + (noexcept(_STD declval() == _STD declval()) && ...); + template requires (sizeof...(_LHSTupleTypes) == sizeof...(_RHSTupleTypes)) _NODISCARD constexpr bool _Zip_iterator_sentinel_equal( const tuple<_LHSTupleTypes...>& _Lhs_tuple, const tuple<_RHSTupleTypes...>& _Rhs_tuple) - noexcept((noexcept(_STD declval() == _STD declval()) && ...)) { + noexcept(_Zip_iterator_sentinel_equal_is_nothrow, tuple<_RHSTupleTypes...>>) { const auto _Evaluate_equality_closure = [&_Lhs_tuple, &_Rhs_tuple](index_sequence<_Indices...>) noexcept( - (noexcept(_STD declval() == _STD declval()) &&...)) { + _Zip_iterator_sentinel_equal_is_nothrow, tuple<_RHSTupleTypes...>>) { return ((_STD get<_Indices>(_Lhs_tuple) == _STD get<_Indices>(_Rhs_tuple)) || ... || false); };