std::experimental::ranges::Invocable, std::experimental::ranges::RegularInvocable
| Definiert in Header <experimental/ranges/concepts> |
||
| template< class F, class... Args > concept bool Invocable = |
(Ranges TS) | |
| template< class F, class... Args > concept bool RegularInvocable = Invocable<F, Args...>; |
(Ranges TS) | |
Das Invocable-Konzept spezifiziert, dass ein aufrufbaren Typ F mit einem Satz von Argumenttypen Args... unter Verwendung der Funktion-Template ranges::invoke aufgerufen werden kann.
Das RegularInvocable-Konzept erweitert das Invocable-Konzept, indem es verlangt, dass der invoke-Ausdruck gleichheitserhaltend ist und weder das Funktionsobjekt noch die Argumente modifiziert.
[bearbeiten] Gleichheitserhaltung
Ein Ausdruck ist gleichheitserhaltend, wenn er bei gleichen Eingaben gleiche Ausgaben liefert.
- Die Eingaben für einen Ausdruck bestehen aus seinen Operanden.
- Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen von dem Ausdruck modifizierten Operanden (falls vorhanden).
Jeder Ausdruck, der gleichheitserhaltend sein muss, muss außerdem stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, solange keine explizite zwischenzeitliche Modifikation dieser Eingabeobjekte erfolgt.
Sofern nicht anders angegeben, muss jeder in einem requires-expression verwendete Ausdruck 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.
[bearbeiten] Hinweise
Die Unterscheidung zwischen Invocable und RegularInvocable ist rein semantisch.
Ein Zufallszahlengenerator kann Invocable erfüllen, aber nicht RegularInvocable (komische gilt nicht für die hier genannten Ausnahmen).