std::ranges::viewable_range - cppreference.com

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

range

that describes a range that can be converted into a

view

through

views::all

.

The constant /*is-initializer-list*/<T> is true if and only if std::remove_cvref_t<T> is a specialization of

std::initializer_list

.

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

LWG 3481

C++20 viewable_range accepted an lvalue of a move-only view rejects

P2415R2

C++20 viewable_range only accepted non-

view

rvalues that are

borrowed_range

accepts more types See also