std::experimental::ranges::ConvertibleTo
| Definiert in Header <experimental/ranges/concepts> |
||
| template< class From, class To > concept bool ConvertibleTo = |
(Ranges TS) | |
Das Konzept ConvertibleTo<From, To> spezifiziert, dass ein Ausdruck mit dem durch From angegebenen Typ und Wertkategorie implizit und explizit in den Typ To konvertiert werden kann und die beiden Konvertierungsformen äquivalent sind.
Insbesondere ist ConvertibleTo<From, To> nur dann erfüllt, wenn, gegeben die erfundene Funktion To test(From (&f)()) { return f(); } und eine Funktion f vom Typ From (), so dass der Ausdruck f() gleichheitserhaltend ist (siehe unten),
- Entweder
-
Toist weder ein Objekttyp noch ein Referenz-zu-Objekt-Typ, oder - static_cast<To>(f()) ist gleich
test(f), und
-
- Eine der folgenden Bedingungen ist erfüllt:
-
Fromist kein Referenz-zu-Objekt-Typ, oder -
Fromist eine rvalue-Referenz auf einen nicht-const-qualifizierten Typ, und der resultierende Zustand des Objekts, auf das durch f() verwiesen wird, ist nach einem der obigen Ausdrücke gültig, aber undefiniert; oder - Das Objekt, auf das durch
f()verwiesen wird, wird durch keinen der obigen Ausdrücke modifiziert.
-
Es muss keine Unterordnungsbeziehung zwischen ConvertibleTo<From, To> und std::is_convertible<From, To>::value bestehen.
[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] Siehe auch
| (C++11)(C++20) |
prüft, ob ein Typ in den anderen Typ konvertierbar ist (Klassenvorlage) |