Namespaces
Variants

std::experimental::ranges:: SizedSentinel

From cppreference.net
template < class S, class I >

concept bool SizedSentinel =
Sentinel < S, I > &&
! ranges :: disable_sized_sentinel < std:: remove_cv_t < S > , std:: remove_cv_t < I >> &&
requires ( const I & i, const S & s ) {
{ s - i } - > Same < ranges :: difference_type_t < I >> && ;
{ i - s } - > Same < ranges :: difference_type_t < I >> && ;

} ;
(1) (ranges TS)
template < class S, class I >
constexpr bool disable_sized_sentinel = false ;
(1) (ranges TS)

Das SizedSentinel -Konzept spezifiziert, dass ein Objekt des Iteratortyps I und ein Objekt des Sentineltyps S subtrahiert werden können, um den Abstand zwischen ihnen in konstanter Zeit zu berechnen.

Sei i ein Iterator vom Typ I und s ein Sentinel vom Typ S , sodass [ i , s ) einen Bereich bezeichnet. Sei N die kleinste Anzahl von Anwendungen von ++i , die notwendig ist, damit bool ( i == s ) wahr wird. Dann ist SizedSentinel<S, I> nur erfüllt, wenn:

  • Wenn N durch ranges :: difference_type_t < I > darstellbar ist, dann ist s - i wohldefiniert und gleich N ; und
  • Wenn -N durch ranges :: difference_type_t < I > darstellbar ist, dann ist i - s wohldefiniert und gleich -N .

Die Variable-Template disable_sized_sentinel bietet einen Mechanismus für Iteratoren und Sentinels, die subtrahiert werden können, aber nicht die semantischen Anforderungen von SizedSentinel erfüllen, um sich von dem Konzept abzumelden, indem die Variable-Template spezialisiert wird, um den Wert true zu haben.

Gleichheitserhaltung

Ein Ausdruck ist gleichheitserhaltend , wenn er bei gleichen Eingaben gleiche Ausgaben liefert.

  • Die Eingaben eines Ausdrucks bestehen aus seinen Operanden.
  • Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen durch den Ausdruck modifizierten Operanden (falls vorhanden).

Jeder Ausdruck, der gleichungserhaltend sein muss, muss darüber hinaus stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, sofern keine explizite Änderung dieser Eingabeobjekte zwischen den Auswertungen erfolgt.

Sofern nicht anders angegeben, muss jeder Ausdruck, der in einem requires-expression verwendet wird, gleichheitserhaltend und stabil sein, und die Auswertung des Ausdrucks darf nur seine nicht-konstanten Operanden modifizieren. Operanden, die konstant sind, dürfen nicht modifiziert werden.

Implizite Ausdrucksvarianten

Ein requires-expression , der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert implizit auch zusätzliche Variationen dieses Ausdrucks, die einen nicht-konstanten Lvalue oder (möglicherweise konstanten) Rvalue für den gegebenen Operanden akzeptieren, es sei denn, eine solche Ausdrucksvariation wird explizit mit abweichender Semantik gefordert. Diese impliziten Ausdrucksvariationen müssen dieselben semantischen Anforderungen erfüllen wie der deklarierte Ausdruck. Das Ausmaß, in dem eine Implementierung die Syntax der Variationen überprüft, ist nicht spezifiziert.