Skip to content

Commit 5ea4ce4

Browse files
burblebeetkoeppe
authored andcommitted
LWG3448 transform_view's sentinel<false> not comparable with iterator<true>
1 parent 596049e commit 5ea4ce4

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

source/ranges.tex

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@
160160

161161
namespace views { inline constexpr @\unspec@ single = @\unspec@; }
162162

163+
template<bool Const, class T>
164+
using @\exposid{maybe-const}@ = conditional_t<Const, const T, T>; // \expos
165+
163166
// \ref{range.iota}, iota view
164167
template<@\libconcept{weakly_incrementable}@ W, @\libconcept{semiregular}@ Bound = unreachable_sentinel_t>
165168
requires @\exposconcept{weakly-equality-comparable-with}@<W, Bound> && semiregular<W>
@@ -4168,14 +4171,19 @@
41684171

41694172
constexpr sentinel_t<@\exposid{Base}@> base() const;
41704173

4171-
friend constexpr bool operator==(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y);
4174+
template<bool OtherConst>
4175+
requires @\libconcept{sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4176+
friend constexpr bool operator==(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
41724177

4173-
friend constexpr range_difference_t<@\exposid{Base}@>
4174-
operator-(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y)
4175-
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
4176-
friend constexpr range_difference_t<@\exposid{Base}@>
4177-
operator-(const @\exposid{sentinel}@& y, const @\exposid{iterator}@<Const>& x)
4178-
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
4178+
template<bool OtherConst>
4179+
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4180+
friend constexpr range_difference_t<@\exposid{maybe-const}@<OtherConst, V>>
4181+
operator-(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
4182+
4183+
template<bool OtherConst>
4184+
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4185+
friend constexpr range_difference_t<@\exposid{maybe-const}@<OtherConst, V>>
4186+
operator-(const @\exposid{sentinel}@& y, const @\exposid{iterator}@<OtherConst>& x);
41794187
};
41804188
}
41814189
\end{codeblock}
@@ -4216,7 +4224,9 @@
42164224

42174225
\indexlibrarymember{operator==}{transform_view::sentinel}
42184226
\begin{itemdecl}
4219-
friend constexpr bool operator==(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y);
4227+
template<bool OtherConst>
4228+
requires @\libconcept{sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4229+
friend constexpr bool operator==(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
42204230
\end{itemdecl}
42214231

42224232
\begin{itemdescr}
@@ -4227,9 +4237,10 @@
42274237

42284238
\indexlibrarymember{operator-}{transform_view::sentinel}%
42294239
\begin{itemdecl}
4230-
friend constexpr range_difference_t<@\exposid{Base}@>
4231-
operator-(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y)
4232-
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
4240+
template<bool OtherConst>
4241+
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4242+
friend constexpr range_difference_t<@\exposid{maybe-const}@<OtherConst, V>>
4243+
operator-(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
42334244
\end{itemdecl}
42344245

42354246
\begin{itemdescr}
@@ -4240,9 +4251,10 @@
42404251

42414252
\indexlibrarymember{operator-}{transform_view::sentinel}%
42424253
\begin{itemdecl}
4243-
friend constexpr range_difference_t<@\exposid{Base}@>
4244-
operator-(const @\exposid{sentinel}@& y, const @\exposid{iterator}@<Const>& x)
4245-
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
4254+
template<bool OtherConst>
4255+
requires @\libconcept{sized_sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
4256+
friend constexpr range_difference_t<@\exposid{maybe-const}@<OtherConst, V>>
4257+
operator-(const @\exposid{sentinel}@& y, const @\exposid{iterator}@<OtherConst>& x);
42464258
\end{itemdecl}
42474259

42484260
\begin{itemdescr}
@@ -5346,7 +5358,9 @@
53465358
constexpr @\exposid{sentinel}@(@\exposid{sentinel}@<!Const> s)
53475359
requires Const && @\libconcept{convertible_to}@<sentinel_t<V>, sentinel_t<@\exposid{Base}@>>;
53485360

5349-
friend constexpr bool operator==(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y);
5361+
template<bool OtherConst>
5362+
requires @\libconcept{sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
5363+
friend constexpr bool operator==(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
53505364
};
53515365
}
53525366
\end{codeblock}
@@ -5377,7 +5391,9 @@
53775391
\indexlibrarymember{operator==}{join_view::sentinel}%3431
53785392

53795393
\begin{itemdecl}
5380-
friend constexpr bool operator==(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y);
5394+
template<bool OtherConst>
5395+
requires @\libconcept{sentinel_for}@<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{maybe-const}@<OtherConst, V>>>
5396+
friend constexpr bool operator==(const @\exposid{iterator}@<OtherConst>& x, const @\exposid{sentinel}@& y);
53815397
\end{itemdecl}
53825398

53835399
\begin{itemdescr}

0 commit comments

Comments
 (0)