1717#include < __iterator/incrementable_traits.h>
1818#include < __iterator/iterator_traits.h>
1919#include < __type_traits/enable_if.h>
20+ #include < __utility/move.h>
2021
2122#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2223# pragma GCC system_header
@@ -26,7 +27,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
2627
2728template <class _InputIter , __enable_if_t <__has_input_iterator_category<_InputIter>::value, int > = 0 >
2829[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _InputIter
29- prev (_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1 ) {
30+ prev (_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n) {
3031 // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation.
3132 // Note that this check duplicates the similar check in `std::advance`.
3233 _LIBCPP_ASSERT_PEDANTIC (__n <= 0 || __has_bidirectional_iterator_category<_InputIter>::value,
@@ -35,6 +36,13 @@ prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n =
3536 return __x;
3637}
3738
39+ template <class _BidirectionalIterator ,
40+ __enable_if_t <__has_bidirectional_iterator_category<_BidirectionalIterator>::value, int > = 0 >
41+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _BidirectionalIterator
42+ prev (_BidirectionalIterator __it) {
43+ return std::prev (std::move (__it), 1 );
44+ }
45+
3846#if _LIBCPP_STD_VER >= 20
3947
4048// [range.iter.op.prev]
0 commit comments