Namespaces
Variants

std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base

From cppreference.net
Ranges library
Range adaptors
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 =

std:: derived_from < T, view_base > || /*is-derived-from-view-interface*/ < T > ;
(2) (depuis C++20)
struct view_base { } ;
(3) (depuis C++20)
1) Le concept 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.
2) La variable template 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 .
3) Dériver de view_base permet aux types range de modéliser view .

Table des matières

Exigences sémantiques

1) T modélise view seulement si :
  • la construction par déplacement de T a une complexité temporelle constante, et
  • si N copies et/ou déplacements sont effectués à partir d'un objet T contenant M éléments, alors ces N objets ont 𝓞(N+M) destruction (ce qui implique qu'un objet view déplacé a 𝓞(1) destruction), et
  • soit std:: copy_constructible < T > est false , soit la construction par copie de T a une complexité temporelle constante, et
  • soit std:: copyable < T > est false , soit l'affectation par copie de T n'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 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