From cppreference.com
template<classT>conceptviewable_range=ranges::range<T>&&((ranges::view<std::remove_cvref_t<T>>&&std::constructible_from<std::remove_cvref_t<T>,T>)||(!ranges::view<std::remove_cvref_t<T>>&&(std::is_lvalue_reference_v<T>||(std::movable<std::remove_reference_t<T>>&&!/*is-initializer-list*/<T>))));(since C++20)The viewable_range concept is a refinement of
that describes a range that can be converted into a
through
.
The constant /*is-initializer-list*/<T> is true if and only if std::remove_cvref_t<T> is a specialization of
.
Example
Run this code
#include<ranges>#include<string>#include<vector>structvalid_result{};structinvalid_result{};template<typenameT>conceptvalid_viewable_range=std::same_as<T,valid_result>;template<typenameT>conceptinvalid_viewable_range=std::same_as<T,invalid_result>;autotest_viewable_range(std::ranges::viewable_rangeauto&&)->valid_result;autotest_viewable_range(auto&&)->invalid_result;intmain(){autoil={1,2,3};intarr[]{1,2,3};std::vectorvec{1,2,3};std::ranges::ref_viewr{arr};std::ranges::owning_viewo{std::string("Hello")};static_assert(requires{{test_viewable_range(il)}->valid_viewable_range;{test_viewable_range(std::move(il))}->invalid_viewable_range;{test_viewable_range(arr)}->valid_viewable_range;{test_viewable_range(std::move(arr))}->invalid_viewable_range;{test_viewable_range(vec)}->valid_viewable_range;{test_viewable_range(std::move(vec))}->valid_viewable_range;{test_viewable_range(r)}->valid_viewable_range;{test_viewable_range(std::move(r))}->valid_viewable_range;{test_viewable_range(o)}->invalid_viewable_range;{test_viewable_range(std::move(o))}->valid_viewable_range;{test_viewable_range(std::ranges::ref_view(o))}->valid_viewable_range;});}Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++20 viewable_range accepted an lvalue of a move-only view rejects
C++20 viewable_range only accepted non-
rvalues that are
accepts more types See also