Namespaces
Variants

std::ranges:: end

From cppreference.net
Ranges library
Range adaptors
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 de point de personnalisation)
Signature d'appel
template < class T >

requires /* voir ci-dessous */

constexpr std:: sentinel_for < ranges:: iterator_t < T >> auto end ( T && t ) ;
(depuis C++20)

Retourne un sentinelle indiquant la fin d'une plage.

range-begin-end.svg

Si l'argument est une lvalue ou si ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est true , alors un appel à ranges::end est expression-équivalent à :

  1. t + std:: extent_v < T > si t a un type tableau de taille connue.
  2. Sinon, decay-copy ( t. end ( ) ) (jusqu'en 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, decay-copy ( end ( t ) ) (jusqu'en 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 on effectuait une recherche dépendante des arguments uniquement.

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.

Table des matières

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)