Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
Défini dans l'en-tête <ranges>
template < class T >

concept range = requires ( T & t ) {
ranges:: begin ( t ) ; // préservant l'égalité pour les itérateurs forward
ranges:: end ( t ) ;

} ;
(depuis C++20)

Le range concept définit les exigences d'un type qui permet l'itération sur ses éléments en fournissant un itérateur et un sentinelle qui dénotent les éléments de la plage.

Table des matières

Exigences sémantiques

Étant donné une expression E telle que decltype ( ( E ) ) est T , T modélise range seulement si

Notes

Une classe range typique n'a besoin de fournir que deux fonctions :

  1. Une fonction membre begin() dont le type de retour modélise input_or_output_iterator .
  2. Une fonction membre end() dont le type de retour modélise sentinel_for <It> , où It est le type de retour de begin() .

Alternativement, elles peuvent être des fonctions non membres, à trouver par argument-dependent lookup .

Exemple

#include <ranges>
// Une plage minimale
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);
// N'est pas une plage : pas de begin/end
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);
// N'est pas une plage : begin ne retourne pas un input_or_output_iterator
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);
int main() {}

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 Applicable à Comportement publié Comportement corrigé
LWG 3915 C++20 ranges:: begin ( t ) et ranges:: end ( t )
ne nécessitaient pas de variations d'expression implicites
suppression de la
description redondante