std::experimental::ranges::Assignable
| Definiert in Header <experimental/ranges/concepts> |
||
| template< class T, class U > Konzept bool Assignable = |
(Ranges TS) | |
Das Konzept Assignable<T, U> spezifiziert, dass ein Ausdruck des Typs und der Wertkategorie von U einem Lvalue-Ausdruck vom Typ T zugewiesen werden kann.
Gegeben
-
t, ein Lvalue vom Typ std::remove_reference_t<T>, der auf ein Objektoverweist, -
u, ein Ausdruck, für den gilt decltype((u)) gleichUist, -
u2, ein vonuunterschiedliches Objekt, das gleichuist,
Assignable<T, U> ist nur dann erfüllt, wenn
- std::addressof(t = u) == std::addressof(o) (d. h. der Zuweisungsausdruck ergibt ein Lvalue, das auf den linken Operanden verweist);
- Nach der Auswertung von t = u
-
tgleichu2ist, es sei denn,uist ein nicht-const Xvalue, das aufoverweist (d. h. die Zuweisung ist eine Selbst-Zuweisung-durch-Verschieben), - wenn
uein GLvalue ist- Wenn es sich um einen nicht-const Xvalue handelt, befindet sich das Objekt, auf das er verweist, in einem gültigen, aber undefinierten Zustand;
- Andernfalls wird das Objekt, auf das er verweist, nicht geändert;
-
Es muss keine subsumierende Beziehung zwischen Assignable<T, U> und std::is_lvalue_reference<T>::value geben.
[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
Eine Deduktionsbedingung der Form { expression } -> Same<T>&& erfordert effektiv, dass decltype((expression))&& exakt denselben Typ hat wie T&&. Dies schränkt sowohl den Typ als auch die Wertkategorie des Ausdrucks ein.
Die Zuweisung muss keine totale Funktion sein. Insbesondere, wenn die Zuweisung an ein Objekt x dazu führen kann, dass ein anderes Objekt y geändert wird, dann ist x = y wahrscheinlich nicht im Definitionsbereich von =. Dies geschieht typischerweise, wenn der rechte Operand direkt oder indirekt vom linken Operanden besessen wird (z. B. bei Smart Pointern auf Knoten in einer knotenbasierten Datenstruktur oder bei etwas wie std::vector<std::any>).