std::ranges::view, std::ranges::enable_view, std::ranges::view_base
| Definiert in der Header-Datei <ranges> |
||
| template<class T> concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>; |
(1) | (seit C++20) |
| template<class T> constexpr bool enable_view = |
(2) | (seit C++20) |
| struct view_base { }; |
(3) | (seit C++20) |
view-Konzept spezifiziert die Anforderungen an einen range-Typ, der geeignete semantische Eigenschaften für die Verwendung in Pipelines von Range-Adaptoren aufweist.enable_view wird verwendet, um anzuzeigen, ob ein range ein view ist. /*is-derived-from-view-interface*/<T> ist true genau dann, wenn T genau eine öffentliche Basisklasse ranges::view_interface<U> für einen Typ U hat und T keine Basisklassen vom Typ ranges::view_interface<V> für einen anderen Typ V hat.Benutzer können
enable_view für cv-unqualifizierte, vom Benutzer definierte Typen, die view modellieren, zu true und für Typen, die dies nicht tun, zu false spezialisieren. Solche Spezialisierungen müssen in konstanten Ausdrücken verwendbar sein und vom Typ const bool sein.Inhalt |
[edit] Semantische Anforderungen
T modelliert view nur, wenn- die Move-Konstruktion von
Tkonstante Zeitkomplexität hat, und - wenn N Kopien und/oder Moves von einem
T-Objekt durchgeführt werden, das M Elemente enthält, dann haben diese N Objekte eine Zerstörungszeitkomplexität von 𝓞(N+M) (was impliziert, dass ein nach einem Move verändertesview-Objekt eine Zerstörungszeitkomplexität von 𝓞(1) hat), und - entweder std::copy_constructible<T> false ist, oder die Kopierkonstruktion von
Tkonstante Zeitkomplexität hat, und - entweder std::copyable<T> false ist, oder die Kopierzuweisung von
Tkeine höhere Zeitkomplexität hat als Zerstörung gefolgt von Kopierkonstruktion.
[edit] Spezialisierungen
Spezialisierungen von enable_view für alle Spezialisierungen der folgenden Standard-Templates sind als true definiert
| (seit C++26) |
[edit] Anmerkungen
Beispiele für view-Typen sind
- Ein
range-Typ, der ein Iteratorpaar umschließt, z. B. std::ranges::subrange<I>. - Ein
range-Typ, der seine Elemente über std::shared_ptr hält und den Besitz mit allen seinen Kopien teilt. - Ein
range-Typ, der seine Elemente bei Bedarf generiert, z. B. std::ranges::iota_view.
Ein kopierbarer Container wie std::vector<std::string> erfüllt im Allgemeinen nicht die semantischen Anforderungen von view, da das Kopieren des Containers alle Elemente kopiert, was nicht in konstanter Zeit erfolgen kann.
Obwohl Views ursprünglich als kostengünstig kopierbare und nicht besitzende Ranges beschrieben wurden, muss ein Typ nicht kopierbar oder nicht besitzend sein, um view zu modellieren. Er muss jedoch immer noch kostengünstig zu kopieren (falls er kopierbar ist), zu verschieben, zuzuweisen und zu zerstören sein, damit Range-Adaptoren keine unerwartete Komplexität aufweisen.
Standardmäßig wird ein Typ, der movable und range modelliert, als View betrachtet, wenn er öffentlich und eindeutig von view_base abgeleitet ist oder von genau einer Spezialisierung von std::ranges::view_interface.
[edit] Beispiel
Ein minimaler View.
#include <ranges> struct ArchetypalView : std::ranges::view_interface<ArchetypalView> { int* begin(); int* end(); }; static_assert(std::ranges::view<ArchetypalView>);
[edit] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P2325R3 | C++20 | view erforderte default_initializable |
erfordert nicht |
| LWG 3549 | C++20 | enable_view erkannte keine Vererbung von view_interface |
erkennt |
| P2415R2 | C++20 | die Einschränkung der Zeitkomplexität der Zerstörung war zu streng | gelockert |