@@ -170,10 +170,12 @@ class concat_view : public view_interface<concat_view<_Views...>> {
170
170
template <class ... _Views>
171
171
concat_view (_Views&&...) -> concat_view<views::all_t <_Views>...>;
172
172
173
- template <input_range... _Views>
174
- requires (view<_Views> && ...) && (sizeof ...(_Views) > 0 ) && __concatable<_Views...>
175
- template <bool _Const>
176
- class concat_view <_Views...>::__iterator {
173
+ template <bool _Const, typename ... _Views>
174
+ struct __concat_view_iterator_category {};
175
+
176
+ template <bool _Const, typename ... _Views>
177
+ requires __all_forward<_Const, _Views...>
178
+ struct __concat_view_iterator_category <_Const, _Views...> {
177
179
private:
178
180
constexpr static bool __derive_pack_random_iterator =
179
181
__derived_from_pack<typename iterator_traits<iterator_t <__maybe_const<_Const, _Views>>>::iterator_category...,
@@ -194,6 +196,13 @@ class concat_view<_Views...>::__iterator {
194
196
_If<__derive_pack_bidirectional_iterator,
195
197
bidirectional_iterator_tag,
196
198
_If<__derive_pack_forward_iterator, forward_iterator_tag, input_iterator_tag > > > >;
199
+ };
200
+
201
+ template <input_range... _Views>
202
+ requires (view<_Views> && ...) && (sizeof ...(_Views) > 0 ) && __concatable<_Views...>
203
+ template <bool _Const>
204
+ class concat_view <_Views...>::__iterator : public __concat_view_iterator_category<_Const, _Views...> {
205
+ public:
197
206
using iterator_concept =
198
207
_If<__concat_is_random_access<_Const, _Views...>,
199
208
random_access_iterator_tag,
0 commit comments