std::ranges::range
| 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
-
[ranges:: begin ( E ),ranges:: end ( E ))dénote un intervalle , et - à la fois ranges:: begin ( E ) et ranges:: end ( E ) ont une complexité amortie constante et ne modifient pas la valeur de E d'une manière observable par les expressions préservant l'égalité , et
-
si le type de
ranges::
begin
(
E
)
modélise
forward_iterator, ranges:: begin ( E ) préserve l'égalité (en d'autres termes, les itérateurs avant permettent les algorithmes multi-pass) .
Notes
Une classe
range
typique n'a besoin de fournir que deux fonctions :
-
Une fonction membre
begin()dont le type de retour modéliseinput_or_output_iterator. -
Une fonction membre
end()dont le type de retour modélisesentinel_for<It>, oùItest le type de retour debegin().
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 |