libstdc++-v3/ChangeLog:
* include/bits/ranges_base.h (viewable_range): Adjust as per
LWG 3481.
* testsuite/std/ranges/adaptors/all.cc (test07): New test.
/// A range which can be safely converted to a view.
template<typename _Tp>
concept viewable_range = range<_Tp>
- && (borrowed_range<_Tp> || view<remove_cvref_t<_Tp>>);
+ && ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>)
+ || (!view<remove_cvref_t<_Tp>> && borrowed_range<_Tp>));
// [range.iter.ops] range iterator operations
static_assert(!noexcept(views::all(BorrowedRange<false, false>(x))));
}
+void
+test07()
+{
+ // LWG 3481
+ struct view_t : ranges::empty_view<int> { // move-only view
+ view_t(const view_t&) = delete;
+ view_t(view_t&&) = default;
+ view_t& operator=(const view_t&) = delete;
+ view_t& operator=(view_t&&) = default;
+ };
+ static_assert(std::movable<view_t> && !std::copyable<view_t>);
+ static_assert(!ranges::viewable_range<view_t&>);
+}
+
int
main()
{
static_assert(test04());
test05();
test06();
+ test07();
}