`<algorithm>`: Relax const-ness requirements on `ranges::_Meow_bound_unchecked` (#4927)

This commit is contained in:
A. Jiang 2024-09-04 12:59:03 +08:00 коммит произвёл GitHub
Родитель 79206df2df
Коммит 1a54b610d6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
2 изменённых файлов: 26 добавлений и 4 удалений

Просмотреть файл

@ -7031,9 +7031,9 @@ namespace ranges {
template <class _It, class _Ty, class _Pr, class _Pj> template <class _It, class _Ty, class _Pr, class _Pj>
_NODISCARD constexpr _It _Lower_bound_unchecked( _NODISCARD constexpr _It _Lower_bound_unchecked(
_It _First, iter_difference_t<_It> _Count, const _Ty& _Val, _Pr _Pred, _Pj _Proj) { _It _First, iter_difference_t<_It> _Count, _Ty&& _Val, _Pr _Pred, _Pj _Proj) {
_STL_INTERNAL_STATIC_ASSERT(forward_iterator<_It>); _STL_INTERNAL_STATIC_ASSERT(forward_iterator<_It>);
_STL_INTERNAL_STATIC_ASSERT(indirect_strict_weak_order<_Pr, const _Ty*, projected<_It, _Pj>>); _STL_INTERNAL_STATIC_ASSERT(indirect_strict_weak_order<_Pr, add_pointer_t<_Ty>, projected<_It, _Pj>>);
using _Diff = iter_difference_t<_It>; using _Diff = iter_difference_t<_It>;
@ -7082,9 +7082,9 @@ namespace ranges {
template <class _It, class _Ty, class _Pr, class _Pj> template <class _It, class _Ty, class _Pr, class _Pj>
_NODISCARD constexpr _It _Upper_bound_unchecked( _NODISCARD constexpr _It _Upper_bound_unchecked(
_It _First, iter_difference_t<_It> _Count, const _Ty& _Val, _Pr _Pred, _Pj _Proj) { _It _First, iter_difference_t<_It> _Count, _Ty&& _Val, _Pr _Pred, _Pj _Proj) {
_STL_INTERNAL_STATIC_ASSERT(forward_iterator<_It>); _STL_INTERNAL_STATIC_ASSERT(forward_iterator<_It>);
_STL_INTERNAL_STATIC_ASSERT(indirect_strict_weak_order<_Pr, const _Ty*, projected<_It, _Pj>>); _STL_INTERNAL_STATIC_ASSERT(indirect_strict_weak_order<_Pr, add_pointer_t<_Ty>, projected<_It, _Pj>>);
using _Diff = iter_difference_t<_It>; using _Diff = iter_difference_t<_It>;

Просмотреть файл

@ -4,9 +4,11 @@
#include <algorithm> #include <algorithm>
#include <cassert> #include <cassert>
#include <concepts> #include <concepts>
#include <cstddef>
#include <ranges> #include <ranges>
#include <span> #include <span>
#include <utility> #include <utility>
#include <vector>
#include <range_algorithm_support.hpp> #include <range_algorithm_support.hpp>
@ -56,6 +58,26 @@ struct instantiator {
} }
}; };
// Test GH-4863: <algorithm>: ranges::inplace_merge doesn't seem to be able to utilize ranges::upper_bound
void test_gh_4863() { // COMPILE-ONLY
{
vector<int> v;
auto cmp = [](int&, int&) { return false; };
ranges::sort(v, cmp);
ranges::inplace_merge(v, v.begin(), cmp);
}
{
struct S {
operator nullptr_t() {
return nullptr;
}
};
vector<int> v;
auto cmp = [](const nullptr_t&, const nullptr_t&) { return false; };
ranges::inplace_merge(v, v.begin(), cmp, [](int) { return S{}; });
}
}
int main() { int main() {
test_bidi<instantiator, P>(); test_bidi<instantiator, P>();
} }