std::ranges::viewable_range(3)

NAME
std::ranges::viewable_range - std::ranges::viewable_range

Synopsis
   Defined in header <ranges>
   template<class T>
   concept viewable_range =
   ranges::range<T> &&
   ((ranges::view<std::remove_cvref_t<T>> &&
   std::constructible_from<std::remove_cvref_t<T>, T>) || (since C++20)
   (!ranges::view<std::remove_cvref_t<T>> &&
   (std::is_lvalue_reference_v<T> ||
   (std::movable<std::remove_reference_t<T>> &&
   !/*is-initializer-list*/<T>))));
   The viewable_range concept is a refinement of range that describes a range that can
   be safely converted into a view.
   The constant /*is-initializer-list*/<T> is true if and only if
   std::remove_cvref_t<T> is a specialization of std::initializer_list.
  Defect reports
   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.
      DR Applied to Behavior as published Correct behavior
   LWG 3481 C++20 viewable_range accepted an lvalue of a rejects
                       move-only view
   P2415R2 C++20 viewable_range only accepted non-view rvalues accepts more types
                       that are borrowed_range