std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base
|
Definiert im Header
<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 eines
range
-Typs, der geeignete semantische Eigenschaften für die Konstruktion von Range-Adapter-Pipelines besitzt.
enable_view
Variable Template wird verwendet, um anzugeben, 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
besitzt, und
T
keine Basisklassen vom Typ
ranges::
view_interface
<
V
>
für einen anderen Typ
V
besitzt.
Benutzer können
enable_view
für cv-unqualifizierte, programmdefinierte Typen, die
view
modellieren, auf
true
spezialisieren, und für Typen, die dies nicht tun, auf
false
. Solche Spezialisierungen müssen
in konstanten Ausdrücken verwendbar
sein und den Typ
const
bool
besitzen.
Inhaltsverzeichnis |
Semantische Anforderungen
T
modelliert
view
nur wenn:
-
Move-Konstruktion von
Tkonstante Zeitkomplexität hat, und -
wenn
N
Kopien und/oder Moves von einem
TObjekt mit M Elementen erstellt werden, dann haben diese N Objekte 𝓞(N+M) Destruktion (was impliziert, dass ein moved-fromviewObjekt 𝓞(1) Destruktion hat), und -
entweder
std::
copy_constructible
<
T
>
false
ist, oder Kopierkonstruktion von
Tkonstante Zeitkomplexität hat, und -
entweder
std::
copyable
<
T
>
false
ist, oder Kopierzuweisung von
Tkeine höhere Zeitkomplexität als Destruktion gefolgt von Kopierkonstruktion hat.
Spezialisierungen
Spezialisierungen von
enable_view
für alle Spezialisierungen der folgenden Standardtemplates sind als
true
definiert:
| (seit C++26) |
Hinweise
Beispiele für
view
-Typen sind:
-
Ein
range-Typ, der ein Paar von Iteratoren umschließt, z.B. std :: ranges:: subrange < I > . -
Ein
range-Typ, der seine Elemente durch std::shared_ptr hält und den Besitz mit allen seinen Kopien teilt. -
Ein
range-Typ, der seine Elemente bei Bedarf erzeugt, z.B. std::ranges::iota_view .
Ein kopierbarer Container wie
std::
vector
<
std::
string
>
erfüllt im Allgemeinen nicht die semantischen Anforderungen einer
view
, da das Kopieren des Containers alle Elemente kopiert, was nicht in konstanter Zeit erfolgen kann.
Während Views ursprünglich als kostengünstig kopierbare und nicht-besitzende Ranges beschrieben wurden, muss ein Typ nicht kopierbar oder nicht-besitzend sein, um das Konzept
view
zu modellieren. Allerdings muss er weiterhin kostengünstig zu kopieren (falls kopierbar), bewegen, zuweisen und zerstören sein, damit
range adaptors
keine unerwarteten Komplexitätsanforderungen haben.
Standardmäßig wird ein Typ, der
movable
und
range
modelliert, als View betrachtet, wenn er öffentlich und eindeutig von
view_base
oder genau einer Spezialisierung von
std::ranges::view_interface
abgeleitet ist.
Beispiel
Eine Mindestansicht.
#include <ranges> struct ArchetypalView : std::ranges::view_interface<ArchetypalView> { int* begin(); int* end(); }; static_assert(std::ranges::view<ArchetypalView>);
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P2325R3 | C++20 |
view
erforderte
default_initializable
|
erfordert nicht |
| LWG 3549 | C++20 |
enable_view
erkannte Vererbung von
view_interface
nicht
|
erkennt |
| P2415R2 | C++20 | die Einschränkung der Zeitkomplexität der Destruktion war zu streng | gelockert |