Namespaces
Variants

std::ranges::range

Depuis fr.cppreference.net
 
 
Bibliothèque de ranges
Adaptateurs de ranges
 
Défini dans l'en-tête <ranges>
template< class T >
concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);
};
(depuis C++20)

Le concept range définit les exigences d'un type qui permet l'itération sur ses éléments en fournissant un itérateur et une sentinelle qui désignent les éléments du range.

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