Namespaces
Variants

std::ranges::end

De fr.cppreference.net
 
 
Bibliothèque des plages
Adaptateurs de plages
 
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 à :

  1. t + std::extent_v<T> si t est un type tableau de taille connue.
    • Si std::remove_all_extents_t<std::remove_reference_t<T>> est incomplet, alors l'appel à ranges::end est mal formé, aucun diagnostic n'est requis.
  2. 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élise std::sentinel_for<ranges::iterator_t<T>>.
  3. Sinon, copie par décomposition(end(t))(jusqu'à C++23)auto(end(t))(depuis C++23), si T est un type classe ou énumération, que cette expression est valide et que son type converti modélise std::sentinel_for<ranges::iterator_t<T>>, où la signification de end est é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

retourne un sentinelle indiquant la fin d'une plage en lecture seule
(objet point de personnalisation)
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)