Skip to content

Commit 871cf97

Browse files
burblebeetkoeppe
authored andcommitted
LWG3569 join_view fails to support ranges of ranges with non-default_initializable iterators
1 parent 86a1ffc commit 871cf97

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

source/ranges.tex

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6497,7 +6497,7 @@
64976497
is_reference_v<range_reference_t<@\exposidnc{Base}@>>;
64986498

64996499
@\exposidnc{OuterIter}@ @\exposid{outer_}@ = @\exposidnc{OuterIter}@(); // \expos
6500-
@\exposidnc{InnerIter}@ @\exposid{inner_}@ = @\exposidnc{InnerIter}@(); // \expos
6500+
optional<@\exposidnc{InnerIter}@> @\exposid{inner_}@; // \expos
65016501
@\exposidnc{Parent}@* @\exposid{parent_}@ = nullptr; // \expos
65026502

65036503
constexpr void @\exposidnc{satisfy}@(); // \expos
@@ -6508,15 +6508,14 @@
65086508
using value_type = range_value_t<range_reference_t<@\exposid{Base}@>>;
65096509
using difference_type = @\seebelow@;
65106510

6511-
@\exposid{iterator}@() requires @\libconcept{default_initializable}@<@\exposid{OuterIter}@> &&
6512-
@\itcorr[-2]\libconcept{default_initializable}@<@\exposid{InnerIter}@> = default;
6511+
@\exposid{iterator}@() requires @\libconcept{default_initializable}@<@\exposid{OuterIter}@> = default;
65136512
constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, @\exposid{OuterIter}@ outer);
65146513
constexpr @\exposid{iterator}@(@\exposid{iterator}@<!Const> i)
65156514
requires Const &&
65166515
@\libconcept{convertible_to}@<iterator_t<V>, @\exposid{OuterIter}@> &&
65176516
@\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>, @\exposid{InnerIter}@>;
65186517

6519-
constexpr decltype(auto) operator*() const { return *@\exposid{inner_}@; }
6518+
constexpr decltype(auto) operator*() const { return **@\exposid{inner_}@; }
65206519

65216520
constexpr @\exposid{InnerIter}@ operator->() const
65226521
requires @\exposconcept{has-arrow}@<@\exposid{InnerIter}@> && @\libconcept{copyable}@<@\exposid{InnerIter}@>;
@@ -6542,12 +6541,12 @@
65426541
@\libconcept{equality_comparable}@<iterator_t<range_reference_t<@\exposid{Base}@>>>;
65436542

65446543
friend constexpr decltype(auto) iter_move(const @\exposid{iterator}@& i)
6545-
noexcept(noexcept(ranges::iter_move(i.@\exposid{inner_}@))) {
6546-
return ranges::iter_move(i.@\exposid{inner_}@);
6544+
noexcept(noexcept(ranges::iter_move(*i.@\exposid{inner_}@))) {
6545+
return ranges::iter_move(*i.@\exposid{inner_}@);
65476546
}
65486547

65496548
friend constexpr void iter_swap(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
6550-
noexcept(noexcept(ranges::iter_swap(x.@\exposid{inner_}@, y.@\exposid{inner_}@)))
6549+
noexcept(noexcept(ranges::iter_swap(*x.@\exposid{inner_}@, *y.@\exposid{inner_}@)))
65516550
requires @\libconcept{indirectly_swappable}@<@\exposid{InnerIter}@>;
65526551
};
65536552
}
@@ -6624,11 +6623,11 @@
66246623
for (; @\exposid{outer_}@ != ranges::end(@\exposid{parent_}@->@\exposid{base_}@); ++@\exposid{outer_}@) {
66256624
auto&& inner = update_inner(@\exposid{outer_}@);
66266625
@\exposid{inner_}@ = ranges::begin(inner);
6627-
if (@\exposid{inner_}@ != ranges::end(inner))
6626+
if (*@\exposid{inner_}@ != ranges::end(inner))
66286627
return;
66296628
}
66306629
if constexpr (@\exposid{ref-is-glvalue}@)
6631-
@\exposid{inner_}@ = @\exposid{InnerIter}@();
6630+
@\exposid{inner_}@.reset();
66326631
\end{codeblock}
66336632
\end{itemdescr}
66346633

@@ -6669,7 +6668,7 @@
66696668
\begin{itemdescr}
66706669
\pnum
66716670
\effects
6672-
Equivalent to \tcode{return \exposid{inner_};}
6671+
Equivalent to: \tcode{return *\exposid{inner_};}
66736672
\end{itemdescr}
66746673

66756674
\indexlibrarymember{operator++}{join_view::\exposid{iterator}}%
@@ -6690,7 +6689,7 @@
66906689
Equivalent to:
66916690
\begin{codeblock}
66926691
auto&& inner_rng = @\placeholder{inner-range}@;
6693-
if (++@\exposid{inner_}@ == ranges::end(inner_rng)) {
6692+
if (++*@\exposid{inner_}@ == ranges::end(inner_rng)) {
66946693
++@\exposid{outer_}@;
66956694
@\exposid{satisfy}@();
66966695
}
@@ -6742,9 +6741,9 @@
67426741
\begin{codeblock}
67436742
if (@\exposid{outer_}@ == ranges::end(@\exposid{parent_}@->@\exposid{base_}@))
67446743
@\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@);
6745-
while (@\exposid{inner_}@ == ranges::begin(*@\exposid{outer_}@))
6746-
@\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@);
6747-
--@\exposid{inner_}@;
6744+
while (*@\exposid{inner_}@ == ranges::begin(*@\exposid{outer_}@))
6745+
*@\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@);
6746+
--*@\exposid{inner_}@;
67486747
return *this;
67496748
\end{codeblock}
67506749
\end{itemdescr}
@@ -6785,14 +6784,14 @@
67856784
\indexlibrarymember{iter_swap}{join_view::\exposid{iterator}}%
67866785
\begin{itemdecl}
67876786
friend constexpr void iter_swap(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
6788-
noexcept(noexcept(ranges::iter_swap(x.@\exposid{inner_}@, y.@\exposid{inner_}@)))
6787+
noexcept(noexcept(ranges::iter_swap(*x.@\exposid{inner_}@, *y.@\exposid{inner_}@)))
67896788
requires @\libconcept{indirectly_swappable}@<@\exposid{InnerIter}@>;
67906789
\end{itemdecl}
67916790

67926791
\begin{itemdescr}
67936792
\pnum
67946793
\effects
6795-
Equivalent to: \tcode{return ranges::iter_swap(x.\exposid{inner_}, y.\exposid{inner_});}
6794+
Equivalent to: \tcode{return ranges::iter_swap(*x.\exposid{inner_}, *y.\exposid{inner_});}
67966795
\end{itemdescr}
67976796

67986797
\rSec3[range.join.sentinel]{Class template \tcode{join_view::\exposid{sentinel}}}

0 commit comments

Comments
 (0)