1 // { dg-options "-std=gnu++20" }
2 // { dg-do compile { target c++20 } }
3 // { dg-require-effective-target hosted }
4 // P2325R3 "Views should not be required to be default constructible"
11 #include <testsuite_iterators.h>
15 template<default_initializable T
> void f();
16 template<typename T
> requires weakly_incrementable
<T
> || ranges::view
<T
> void f();
21 // Verify neither std::weakly_incrementable nor ranges::view require
22 // default_initializable.
23 f
<int>(); // { dg-error "ambiguous" }
29 // Verify these iterators are not default constructible.
30 static_assert(!default_initializable
<insert_iterator
<vector
<int>>>);
31 static_assert(!default_initializable
<front_insert_iterator
<vector
<int>>>);
32 static_assert(!default_initializable
<back_insert_iterator
<vector
<int>>>);
33 static_assert(!default_initializable
<ostream_iterator
<int>>);
35 using iter
= ostream_iterator
<int>;
37 // Verify common_iterator is conditionally default constructible.
38 static_assert(!default_initializable
<common_iterator
<iter
, unreachable_sentinel_t
>>);
39 static_assert(default_initializable
<common_iterator
<int*, unreachable_sentinel_t
>>);
41 // Verify counted_iterator is conditionally default constructible.
42 static_assert(!default_initializable
<counted_iterator
<iter
>>);
43 static_assert(default_initializable
<counted_iterator
<int*>>);
49 using iter
= ostream_iterator
<int>;
51 // Verify iota_view is conditionally default constructible.
52 static_assert(!default_initializable
<ranges::iota_view
<iter
>>);
53 static_assert(!default_initializable
<decltype(declval
<ranges::iota_view
<iter
>>().begin())>);
54 static_assert(default_initializable
<ranges::iota_view
<int>>);
55 static_assert(default_initializable
<decltype(declval
<ranges::iota_view
<int>>().begin())>);
57 // Verify subrange is conditionally default constructible.
58 static_assert(!default_initializable
<ranges::subrange
<iter
, unreachable_sentinel_t
>>);
59 static_assert(default_initializable
<ranges::subrange
<int*, unreachable_sentinel_t
>>);
61 // Verify single_view is conditionally default constructible.
62 static_assert(!default_initializable
<ranges::single_view
<iter
>>);
63 static_assert(default_initializable
<ranges::single_view
<int*>>);
69 // Verify basic_istream_view is not default constructible.
70 using type
= ranges::basic_istream_view
<int, char, char_traits
<char>>;
71 static_assert(!default_initializable
<type
>);
72 static_assert(!default_initializable
<decltype(declval
<type
>().begin())>);
78 // Verify ref_view is not default constructible.
79 static_assert(!default_initializable
<ranges::ref_view
<int[5]>>);
82 template<auto adaptor
>
86 auto f1
= [] (auto) { return true; };
87 auto f2
= [i
=0] (auto) { return true; };
88 static_assert(default_initializable
<decltype(views::single(0) | adaptor(f1
))>);
89 static_assert(!default_initializable
<decltype(views::single(0) | adaptor(f2
))>);
91 struct S
{ S() = delete; };
92 static_assert(!default_initializable
<decltype(views::single(declval
<S
>()) | adaptor(f1
))>);
93 static_assert(!default_initializable
<decltype(views::single(declval
<S
>()) | adaptor(f2
))>);
96 // Verify filter_view, transform_view, take_while_view and drop_while_view are
97 // conditionally default constructible.
98 template void test06
<views::filter
>();
99 template void test06
<views::transform
>();
100 template void test06
<views::take_while
>();
101 template void test06
<views::drop_while
>();
106 // Verify join_view is conditionally default constructible.
107 struct S
{ S() = delete; };
108 using type1
= ranges::join_view
<ranges::single_view
<ranges::single_view
<S
>>>;
109 static_assert(!default_initializable
<type1
>);
110 using type2
= ranges::join_view
<ranges::single_view
<ranges::single_view
<int>>>;
111 static_assert(default_initializable
<type2
>);
117 // Verify lazy_split_view is conditionally default constructible.
118 using type1
= ranges::lazy_split_view
<ranges::ref_view
<int[2]>, ranges::single_view
<int>>;
119 static_assert(!default_initializable
<type1
>);
120 using type2
= ranges::lazy_split_view
<ranges::single_view
<int>, ranges::ref_view
<int[2]>>;
121 static_assert(!default_initializable
<type2
>);
122 using type3
= ranges::lazy_split_view
<ranges::ref_view
<int[2]>, ranges::ref_view
<int[2]>>;
123 static_assert(!default_initializable
<type3
>);
124 using type4
= ranges::lazy_split_view
<ranges::single_view
<int>, ranges::single_view
<int>>;
125 static_assert(default_initializable
<type4
>);
131 // Verify split_view is conditionally default constructible.
132 using type1
= ranges::split_view
<ranges::ref_view
<int[2]>, ranges::single_view
<int>>;
133 static_assert(!default_initializable
<type1
>);
134 using type2
= ranges::split_view
<ranges::single_view
<int>, ranges::ref_view
<int[2]>>;
135 static_assert(!default_initializable
<type2
>);
136 using type3
= ranges::split_view
<ranges::ref_view
<int[2]>, ranges::ref_view
<int[2]>>;
137 static_assert(!default_initializable
<type3
>);
138 using type4
= ranges::split_view
<ranges::single_view
<int>, ranges::single_view
<int>>;
139 static_assert(default_initializable
<type4
>);
145 // Verify common_view is conditionally default constructible.
146 using type1
= ranges::common_view
<ranges::iota_view
<ostream_iterator
<int>>>;
147 static_assert(!default_initializable
<type1
>);
148 using type2
= ranges::common_view
<ranges::iota_view
<int*>>;
149 static_assert(default_initializable
<type2
>);
155 // Verify reverse_view is conditionally default constructible.
156 using type1
= ranges::reverse_view
<ranges::ref_view
<int[2]>>;
157 static_assert(!default_initializable
<type1
>);
158 using type2
= ranges::reverse_view
<ranges::single_view
<int>>;
159 static_assert(default_initializable
<type2
>);
165 // Verify elements_view is conditionally default constructible.
166 using type1
= ranges::elements_view
<ranges::ref_view
<pair
<int,int>[2]>, 0>;
167 static_assert(!default_initializable
<type1
>);
168 using type2
= ranges::elements_view
<ranges::single_view
<pair
<int,int>>, 0>;
169 static_assert(default_initializable
<type2
>);