std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base
|
Défini dans l'en-tête
<ranges>
|
||
|
template
<
class
T
>
concept view = ranges:: range < T > && std:: movable < T > && ranges :: enable_view < T > ; |
(1) | (depuis C++20) |
|
template
<
class
T
>
constexpr
bool
enable_view
=
|
(2) | (depuis C++20) |
|
struct
view_base
{
}
;
|
(3) | (depuis C++20) |
view
spécifie les exigences d'un type
range
qui possède des propriétés sémantiques appropriées pour être utilisé dans la construction de pipelines d'adaptateurs de plages.
enable_view
est utilisée pour indiquer si un
range
est une
view
.
/*is-derived-from-view-interface*/
<
T
>
est
true
si et seulement si
T
a exactement une classe de base publique
ranges::
view_interface
<
U
>
pour un certain type
U
, et
T
n'a pas de classes de base de type
ranges::
view_interface
<
V
>
pour tout autre type
V
.
Les utilisateurs peuvent spécialiser
enable_view
à
true
pour les types définis par le programme sans qualificatif cv qui modélisent une
view
, et à
false
pour les types qui ne le font pas. Ces spécialisations doivent être
utilisables dans des expressions constantes
et avoir le type
const
bool
.
Table des matières |
Exigences sémantiques
T
modélise
view
seulement si :
-
la construction par déplacement de
Ta une complexité temporelle constante, et -
si
N
copies et/ou déplacements sont effectués à partir d'un objet
Tcontenant M éléments, alors ces N objets ont 𝓞(N+M) destruction (ce qui implique qu'un objetviewdéplacé a 𝓞(1) destruction), et -
soit
std::
copy_constructible
<
T
>
est
false
, soit la construction par copie de
Ta une complexité temporelle constante, et -
soit
std::
copyable
<
T
>
est
false
, soit l'affectation par copie de
Tn'a pas une complexité temporelle supérieure à une destruction suivie d'une construction par copie.
Spécialisations
Les spécialisations de
enable_view
pour toutes les spécialisations des modèles standards suivants sont définies comme
true
:
| (depuis C++26) |
Notes
Exemples de types de
view
sont :
-
Un type de
rangequi encapsule une paire d'itérateurs, par exemple, std :: ranges:: subrange < I > . -
Un type de
rangequi détient ses éléments via std::shared_ptr et partage la propriété avec toutes ses copies. -
Un type de
rangequi génère ses éléments à la demande, par exemple, std::ranges::iota_view .
Un conteneur copiable tel que
std::
vector
<
std::
string
>
ne satisfait généralement pas aux exigences sémantiques d'une
view
puisque copier le conteneur copie tous les éléments, ce qui ne peut être fait en temps constant.
Bien que les vues aient été initialement décrites comme des gammes non propriétaires et peu coûteuses à copier, un type n'est pas obligé d'être copiable ou non propriétaire pour modéliser
view
. Cependant, il doit rester peu coûteux à copier (s'il est copiable), déplacer, assigner et détruire, afin que
range adaptors
n'aient pas une complexité inattendue.
Par défaut, un type modélisant
movable
et
range
est considéré comme une vue s'il est dérivé publiquement et sans ambiguïté de
view_base
, ou d'exactement une spécialisation de
std::ranges::view_interface
.
Exemple
Une vue minimale.
#include <ranges> struct ArchetypalView : std::ranges::view_interface<ArchetypalView> { int* begin(); int* end(); }; static_assert(std::ranges::view<ArchetypalView>);
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| P2325R3 | C++20 |
view
nécessitait
default_initializable
|
ne nécessite pas |
| LWG 3549 | C++20 |
enable_view
ne détectait pas l'héritage de
view_interface
|
détecte |
| P2415R2 | C++20 | la restriction sur la complexité temporelle de la destruction était trop stricte | assouplie |