constexpr bool enable_view =
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
trueif 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
truefor cv-unqualified program-defined types which model
view
, and
falsefor types which do not. Such specializations must be
usable in constant expressionsand have type
const bool.
3)Deriving from
view_base
enables
range
types to model
view
.
[edit] Semantic requirements 1)T
models
view
only if:
T
has constant time complexity, andT
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-from view
object has \(\scriptsize \mathcal{O}{(1)}\)ð(1) destruction), andT
has constant time complexity, andT
has no more time complexity than destruction followed by copy construction.Specializations of enable_view
for all specializations of the following standard templates are defined as true:
Examples of view
types are:
range
type that wraps a pair of iterators, e.g., std::ranges::subrange<I>.range
type that holds its elements by std::shared_ptr and shares ownership with all its copies.range
type that generates its elements on demand, e.g., std::ranges::iota_view.A copyable container such as 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.
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 model view
. However, it must still be cheap to copy (if it is copyable), move, assign, and destroy, so that range adaptors will not have unexpected complexity.
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.
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++20view
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
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4