// { dg-options "-std=gnu++20" } // { dg-do compile { target c++20 } } // P2325R3 "Views should not be required to be default constructible" #include #include #include #include #include #include using namespace std; template void f(); template requires weakly_incrementable || ranges::view void f(); void test01() { // Verify neither std::weakly_incrementable nor ranges::view require // default_initializable. f(); // { dg-error "ambiguous" } } void test02() { // Verify these iterators are not default constructible. static_assert(!default_initializable>>); static_assert(!default_initializable>>); static_assert(!default_initializable>>); static_assert(!default_initializable>); using iter = ostream_iterator; // Verify common_iterator is conditionally default constructible. static_assert(!default_initializable>); static_assert(default_initializable>); // Verify counted_iterator is conditionally default constructible. static_assert(!default_initializable>); static_assert(default_initializable>); } void test03() { using iter = ostream_iterator; // Verify iota_view is conditionally default constructible. static_assert(!default_initializable>); static_assert(!default_initializable>().begin())>); static_assert(default_initializable>); static_assert(default_initializable>().begin())>); // Verify subrange is conditionally default constructible. static_assert(!default_initializable>); static_assert(default_initializable>); // Verify single_view is conditionally default constructible. static_assert(!default_initializable>); static_assert(default_initializable>); } void test04() { // Verify basic_istream_view is not default constructible. using type = ranges::basic_istream_view>; static_assert(!default_initializable); static_assert(!default_initializable().begin())>); } void test05() { // Verify ref_view is not default constructible. static_assert(!default_initializable>); } template void test06() { auto f1 = [] (auto) { return true; }; auto f2 = [i=0] (auto) { return true; }; static_assert(default_initializable); static_assert(!default_initializable); struct S { S() = delete; }; static_assert(!default_initializable()) | adaptor(f1))>); static_assert(!default_initializable()) | adaptor(f2))>); } // Verify filter_view, transform_view, take_while_view and drop_while_view are // conditionally default constructible. template void test06(); template void test06(); template void test06(); template void test06(); void test07() { // Verify join_view is conditionally default constructible. struct S { S() = delete; }; using type1 = ranges::join_view>>; static_assert(!default_initializable); using type2 = ranges::join_view>>; static_assert(default_initializable); } void test08() { // Verify lazy_split_view is conditionally default constructible. using type1 = ranges::lazy_split_view, ranges::single_view>; static_assert(!default_initializable); using type2 = ranges::lazy_split_view, ranges::ref_view>; static_assert(!default_initializable); using type3 = ranges::lazy_split_view, ranges::ref_view>; static_assert(!default_initializable); using type4 = ranges::lazy_split_view, ranges::single_view>; static_assert(default_initializable); } void test08a() { // Verify split_view is conditionally default constructible. using type1 = ranges::split_view, ranges::single_view>; static_assert(!default_initializable); using type2 = ranges::split_view, ranges::ref_view>; static_assert(!default_initializable); using type3 = ranges::split_view, ranges::ref_view>; static_assert(!default_initializable); using type4 = ranges::split_view, ranges::single_view>; static_assert(default_initializable); } void test09() { // Verify common_view is conditionally default constructible. using type1 = ranges::common_view>>; static_assert(!default_initializable); using type2 = ranges::common_view>; static_assert(default_initializable); } void test10() { // Verify reverse_view is conditionally default constructible. using type1 = ranges::reverse_view>; static_assert(!default_initializable); using type2 = ranges::reverse_view>; static_assert(default_initializable); } void test11() { // Verify elements_view is conditionally default constructible. using type1 = ranges::elements_view[2]>, 0>; static_assert(!default_initializable); using type2 = ranges::elements_view>, 0>; static_assert(default_initializable); }