std::ranges::sized_range, std::ranges::disable_sized_range
Depuis fr.cppreference.net
| Défini dans l'en-tête <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(1) | (depuis C++20) (jusqu'à C++26) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(depuis C++26) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (depuis C++20) |
1) Le concept
sized_range spécifie les exigences d'un type d'intervalle (range)(jusqu'à C++26)approximately_sized_range(depuis C++26) qui connaît sa taille en temps constant avec la fonction size.2)
disable_sized_range existe pour permettre l'utilisation de types d'intervalles qui fournissent une fonction size (soit en tant que membre, soit en tant que non-membre) mais qui ne modélisent pas réellement sized_range. Les utilisateurs peuvent spécialiser disable_sized_range pour des types définis par programme non qualifiés cv. De telles spécialisations doivent être utilisables dans des expressions constantes et être de type const bool.Exigences sémantiques
1)
Étant donné une lvalue
t
de type
std::
remove_reference_t
<
T
>
,
T
modélise
sized_range
seulement si
- ranges:: size ( t )
-
- a une complexité amortie constante,
- ne modifie pas la valeur de t d'une manière observable par les expressions préservant l'égalité , et
- est égal à ranges:: distance ( ranges:: begin ( t ) , ranges:: end ( t ) ) , et
-
si
ranges::
iterator_t
<
T
>
modélise
forward_iterator, ranges:: size ( t ) est bien défini indépendamment de l'évaluation de ranges:: begin ( t ) (en d'autres termes, un sized_range à passage unique peut supporter un appel à size seulement avant le premier appel à begin, mais un forward_range doit supporter size à tout moment).
Notes
disable_sized_range
ne peut pas être utilisé pour désactiver la taille d'un intervalle dont l'itérateur et le sentinelle satisfont
sized_sentinel_for
;
std::disable_sized_sentinel_for
doit être utilisé à la place.
disable_sized_range
ne peut pas être spécialisé pour les types tableau ou les types référence.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range et ranges::reserve_hint |
Exemple
Exécuter ce code
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
Voir aussi
|
(C++20)
|
spécifie une gamme dont le type d'itérateur satisfait
random_access_iterator
(concept) |
|
(C++20)
|
spécifie une gamme dont le type d'itérateur satisfait
contiguous_iterator
(concept) |