std::ranges::view, std::ranges::enable_view, std::ranges::view_base
From cppreference.com
Defined in header <ranges>
|
||
template<class T> concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>; |
(1) | (since C++20) |
template<class T> inline constexpr bool enable_view = |
(2) | (since C++20) |
struct view_base { }; |
(3) | (since C++20) |
1) The
view
concept specifies the requirements of a range
type that has suitable semantic properties for use in constructing range adaptor pipelines.2) The
Users may specialize
enable_view
variable template is used to indicate whether a range
is a view
. /*is-derived-from-view-interface*/<T> is true if and only if T
has exactly one public base class ranges::view_interface<U> for some type U
, and T
has no base classes of type ranges::view_interface<V> for any other type V
.
Users may specialize
enable_view
to true for cv-unqualified program-defined types which model view
, and false for types which do not. Such specializations must be usable in constant expressions and have type const bool.Semantic requirements
1)
T
models view
only if:
- move construction of
T
has constant time complexity, and - if N copies and/or moves are made from a
T
object holding M elements, then these N objects have 𝓞(N+M) destruction (which implies that a moved-fromview
object has 𝓞(1) destruction), and - either std::copy_constructible<T> is false, or copy construction of
T
has constant time complexity, and - either std::copyable<T> is false, or copy assignment of
T
has no more time complexity than destruction followed by copy construction.
Notes
Examples of view
types are:
- A
range
type that wraps a pair of iterators, e.g., std::ranges::subrange<I>. - A
range
type that holds its elements by std::shared_ptr and shares ownership with all its copies. - A
range
type that generates its elements on demand, e.g., std::ranges::iota_view.
Copyable containers like std::vector<std::string> generally does not meet the semantic requirements of view
since copying the container copies all of the elements, which cannot be done in constant time.
By default, a type modeling movable
and range
is considered a view if it is publicly and unambiguously derived from view_base
, or exactly one specialization of std::ranges::view_interface.
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2325R3 | C++20 | view required default_initializable
|
does not require |
LWG 3549 | C++20 | enable_view did not detect inheritance from view_interface
|
detects |
P2415R2 | C++20 | the restriction on the time complexity of destruction was too strict | relaxed |