Namespaces
Variants

std::experimental::ranges:: advance

From cppreference.net
Défini dans l'en-tête <experimental/ranges/iterator>
namespace {

constexpr /* non spécifié */ advance = /* non spécifié */ ;

}
(ranges TS)
(objet de point de personnalisation)
Signature d'appel
template < Iterator I >
constexpr void advance ( I & i, ranges :: difference_type_t < I > n ) ;
(1)
template < Iterator I, Sentinel < I > S >
constexpr void advance ( I & i, S bound ) ;
(2)
template < Iterator I, Sentinel < I > S >
constexpr ranges :: difference_type_t < I > advance ( I & i, ranges :: difference_type_t < I > n, S bound ) ;
(3)

Avance l'itérateur i n fois, ou jusqu'à ce que bound soit atteint, selon la première éventualité.

1) Si I modélise RandomAccessIterator , équivalent à i + = n . Sinon, incrémente (ou décrémente si n est négatif) i n fois. Le comportement est indéfini si n est négatif et I ne modélise pas BidirectionalIterator .
2) Si Assignable < I & , S > est satisfait, équivalent à i = std :: move ( bound ) .
Sinon, si [ i , bound ) ne dénote pas une plage, le comportement est indéfini.
Sinon, si SizedSentinel < S, I > est satisfait, équivalent à ranges:: advance ( i, bound - i ) .
Sinon, incrémente i jusqu'à ce que i == bound .
3) Si SizedSentinel < S, I > est satisfait, équivalent à ranges:: advance ( i, bound ) si | n | ≥ | bound - i |, et ranges:: advance ( i, n ) sinon.
Sinon, incrémente (ou décrémente si n est négatif) i soit n fois ou jusqu'à ce que i == bound , selon la première éventualité.
Si n > 0 , [ i , bound ) désigne un intervalle ; si n == 0 , soit [ i , bound ) soit [ bound , i ) désigne un intervalle ; si n < 0 , [ bound , i ) désigne un intervalle, I et S doivent être du même type, et I doit modéliser BidirectionalIterator . Sinon, le comportement est indéfini.

Table des matières

Objets de point de personnalisation

Le nom ranges::advance désigne un objet de point de personnalisation , qui est un objet fonction d'un type de classe littéral Semiregular (désigné, à des fins d'exposition, comme AdvanceT ). Toutes les instances de AdvanceT sont égales. Ainsi, ranges::advance peut être copié librement et ses copies peuvent être utilisées de manière interchangeable.

Étant donné un ensemble de types Args... , si std:: declval < Args > ( ) ... satisfont aux exigences pour les arguments de ranges::advance ci-dessus, AdvanceT satisfera ranges :: Invocable < const AdvanceT, Args... > . Sinon, aucun opérateur d'appel de fonction de AdvanceT ne participe à la résolution de surcharge.

Dans chaque unité de traduction où ranges::advance est défini, il fait référence à la même instance de l'objet de point de personnalisation. (Cela signifie qu'il peut être utilisé librement dans des éléments comme les fonctions inline et les modèles de fonction sans violer la règle de définition unique .)

Valeur de retour

1,2) (aucun)
3) Le nombre d'incrémentations/décrémentations non effectuées en raison de l'atteinte de la bound . Autrement dit, n - M , où M est la distance entre la position de départ de i et la position d'arrivée, et est négative si la position d'arrivée est avant la position de départ.

Exemple

Voir aussi

avance un itérateur d'une distance donnée
(modèle de fonction)
retourne la distance entre un itérateur et un sentinelle, ou entre le début et la fin d'une plage
(modèle de fonction)
incrémente un itérateur
(modèle de fonction)
décrémente un itérateur
(modèle de fonction)