std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
Défini dans l'en-tête
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
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
-
[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 |