зеркало из https://github.com/microsoft/STL.git
`<algorithm>`: Relax const-ness requirements on `ranges::_Meow_bound_unchecked` (#4927)
This commit is contained in:
Родитель
79206df2df
Коммит
1a54b610d6
|
@ -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>();
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче