| | |
| (1) | (since C++20) |
template<class T>
constexprbool enable_view=
std::derived_from<T, view_base>||/*is-derived-from-view-interface*/<T>; | (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
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
constbool.
3) Deriving from
view_base
enables
range
types to model
view
.
[edit]Semantic requirements
1)T
models
view
only if:
- move construction of
T
has constant time complexity, and - if\(\scriptsize N\)N copies and/or moves are made from a
T
object holding\(\scriptsize M\)M elements, then these\(\scriptsize N\)N objects have\(\scriptsize \mathcal{O}{(N+M)}\)𝓞(N+M) destruction (which implies that a moved-fromview
object has\(\scriptsize \mathcal{O}{(1)}\)𝓞(1) destruction), and - eitherstd::copy_constructible<T> isfalse, or copy construction of
T
has constant time complexity, and - eitherstd::copyable<T> isfalse, or copy assignment of
T
has no more time complexity than destruction followed by copy construction.
[edit]Specializations
Specializations ofenable_view
for all specializations of the following standard templates are defined astrue:
Examples ofview
types are:
A copyable container such asstd::vector<std::string> generally does not meet the semantic requirements ofview
since copying the container copies all of the elements, which cannot be done in constant time.
While views were originally described as cheaply copyable and non-owning ranges, a type is not required to be copyable or non-owning for it to modelview
. However, it must still be cheap to copy (if it is copyable), move, assign, and destroy, so thatrange adaptors will not have unexpected complexity.
By default, a type modelingmovable
andrange
is considered a view if it is publicly and unambiguously derived fromview_base
, or exactly one specialization ofstd::ranges::view_interface.
[edit]Example
A minimum view.
#include <ranges> struct ArchetypalView: std::ranges::view_interface<ArchetypalView>{int* begin();int* end();}; static_assert(std::ranges::view<ArchetypalView>);
[edit]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 requireddefault_initializable | does not require |
LWG 3549 | C++20 | enable_view did not detect inheritance fromview_interface | detects |
P2415R2 | C++20 | the restriction on the time complexity of destruction was too strict | relaxed |