Make join_view and join_with_view iterators default-constructible (the forgotten part of P2770R0) (#4264)

This commit is contained in:
S. B. Tam 2024-01-09 17:37:40 +08:00 коммит произвёл GitHub
Родитель 90691c1800
Коммит c21ba55e4c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 22 добавлений и 9 удалений

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

@ -3809,9 +3809,7 @@ namespace ranges {
using value_type = range_value_t<_InnerRng<_Const>>;
using difference_type = common_type_t<range_difference_t<_Base>, range_difference_t<_InnerRng<_Const>>>;
// clang-format off
_Iterator() requires default_initializable<_OuterIter> = default;
// clang-format on
_Iterator() = default;
constexpr _Iterator(_Iterator<!_Const> _It)
requires _Const && convertible_to<iterator_t<_Vw>, _OuterIter>
@ -4265,9 +4263,7 @@ namespace ranges {
using value_type = common_type_t<iter_value_t<_InnerIter>, iter_value_t<_PatternIter>>;
using difference_type = _Common_diff_t<_OuterIter, _InnerIter, _PatternIter>;
// clang-format off
_Iterator() requires default_initializable<_OuterIter> = default;
// clang-format on
_Iterator() = default;
constexpr _Iterator(_Iterator<!_Const> _It)
requires _Const && convertible_to<iterator_t<_Vw>, _OuterIter>

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

@ -1202,9 +1202,6 @@ std/ranges/range.adaptors/range.join/range.join.iterator/star.pass.cpp:0 FAIL
# Not analyzed. constexpr evaluation fails in ranges::swap.
std/ranges/range.adaptors/range.join/range.join.iterator/iter.swap.pass.cpp:0 FAIL
# Not analyzed. Fails static_assert(std::is_default_constructible_v<JoinIterator>).
std/ranges/range.adaptors/range.join/range.join.iterator/ctor.default.pass.cpp FAIL
# Not analyzed. constexpr evaluation fails in assert(element_moved == 1).
std/ranges/range.adaptors/range.lazy.split/ctor.range.pass.cpp:0 FAIL
std/ranges/range.adaptors/range.split/ctor.range.pass.cpp:0 FAIL

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

@ -177,6 +177,16 @@ constexpr bool test_one(Outer&& rng, Expected&& expected) {
}
}
// Also validate that join_view iterators are default-constructible
{
STATIC_ASSERT(is_default_constructible_v<iterator_t<R>>);
[[maybe_unused]] iterator_t<R> i;
if constexpr (CanMemberBegin<const R>) {
STATIC_ASSERT(is_default_constructible_v<iterator_t<const R>>);
[[maybe_unused]] iterator_t<const R> ci;
}
}
// Validate join_view::end
static_assert(CanMemberEnd<R>);
static_assert(CanMemberEnd<const R>

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

@ -219,6 +219,16 @@ constexpr void test_one(Outer&& rng, Delimiter&& delimiter, Expected&& expected)
}
}
// Also validate that join_with_view iterators are default-constructible
{
STATIC_ASSERT(is_default_constructible_v<iterator_t<R>>);
[[maybe_unused]] iterator_t<R> i;
if constexpr (CanMemberBegin<const R>) {
STATIC_ASSERT(is_default_constructible_v<iterator_t<const R>>);
[[maybe_unused]] iterator_t<const R> ci;
}
}
// Validate join_with_view::end
static_assert(CanMemberEnd<R>);
static_assert(CanMemberEnd<const R>