std::ranges::end
| Défini dans l'en-tête <ranges>
|
||
| Défini dans l'en-tête <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ end = /* unspecified */;
}
|
(depuis C++20) (objet point de personnalisation) |
|
| Signature d'appel |
||
template< class T >
requires /* see below */
constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
|
(depuis C++20) | |
Renvoie une sentinelle indiquant la fin d'une plage.
Si l'argument est une lvalue ou ranges::enable_borrowed_range<std::remove_cv_t<T>> est true, alors un appel à ranges::end est équivalent à une expression à :
t + std::extent_v<T>sitest un type tableau de taille connue.- Si
std::remove_all_extents_t<std::remove_reference_t<T>>est incomplet, alors l'appel àranges::endest mal formé, aucun diagnostic n'est requis.
- Si
- Sinon, copie par décomposition
(t.end())(jusqu'à C++23)auto(t.end())(depuis C++23), si cette expression est valide et que son type modélisestd::sentinel_for<ranges::iterator_t<T>>. - Sinon, copie par décomposition
(end(t))(jusqu'à C++23)auto(end(t))(depuis C++23), siTest un type classe ou énumération, que cette expression est valide et que son type converti modélisestd::sentinel_for<ranges::iterator_t<T>>, où la signification deendest établie comme si en effectuant une recherche dépendant des arguments seulement.
Dans tous les autres cas, un appel à ranges::end est mal formé, ce qui peut entraîner un échec de substitution lorsque l'appel à ranges::end apparaît dans le contexte immédiat d'une instanciation de modèle.
Objets de point de personnalisation
Le nom
ranges::end
désigne un
objet de point de personnalisation
, qui est un
objet fonction
constant d'un type de classe
littéral
semiregular
. Voir
CustomizationPointObject
pour plus de détails.
Notes
Si l'argument est une rvalue (c'est-à-dire
T
est un type objet) et que
ranges::
enable_borrowed_range
<
std::
remove_cv_t
<
T
>>
est
false
, ou s'il s'agit d'un type tableau de taille inconnue, l'appel à
ranges::end
est mal formé, ce qui entraîne également un échec de substitution.
Si
ranges
::
end
(
std::
forward
<
T
>
(
t
)
)
est valide, alors
decltype
(
ranges
::
end
(
std::
forward
<
T
>
(
t
)
)
)
et
decltype
(
ranges::
begin
(
std::
forward
<
T
>
(
t
)
)
)
modélisent
std::sentinel_for
dans tous les cas, tandis que
T
modélise
std::ranges::range
.
La norme C++20 exige que si l'appel sous-jacent à la fonction
end
retourne une prvalue, la valeur de retour soit construite par déplacement à partir de l'objet temporaire matérialisé. Toutes les implémentations retournent directement la prvalue à la place. L'exigence est corrigée par la proposition post-C++20
P0849R8
pour correspondre aux implémentations.
Exemple
#include <algorithm> #include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> vec{3, 1, 4}; if (std::ranges::find(vec, 5) != std::ranges::end(vec)) std::cout << "found a 5 in vector vec!\n"; int arr[]{5, 10, 15}; if (std::ranges::find(arr, 5) != std::ranges::end(arr)) std::cout << "found a 5 in array arr!\n"; }
Sortie :
found a 5 in array arr!
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 | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| P2602R2 | C++20 |
il existe un mécanisme pour interdire certains
end
non-membres trouvés par
ADL
|
suppression de ce mécanisme |
Voir aussi
|
(C++20)
|
retourne un sentinelle indiquant la fin d'une plage en lecture seule
(objet point de personnalisation) |
|
(C++20)
|
retourne un itérateur vers le début d'une plage
(objet point de personnalisation) |
|
(C++11)
(C++14)
|
retourne un itérateur vers la fin d'un conteneur ou d'un tableau
(modèle de fonction) |