std::experimental::ranges:: Assignable
|
Definiert im Header
<experimental/ranges/concepts>
|
||
|
template
<
class
T,
class
U
>
concept
bool
Assignable
=
|
(ranges TS) | |
Das Konzept
Assignable<T, U>
spezifiziert, dass ein Ausdruck des durch
U
spezifizierten Typs und Wertkategorie einem Lvalue-Ausdruck zugewiesen werden kann, dessen Typ durch
T
spezifiziert ist.
Gegeben
-
t, ein L-Wert vom Typ std:: remove_reference_t < T > , der auf ein Objektoverweist, -
u, ein Ausdruck, für den decltype ( ( u ) ) den TypUhat, -
u2, ein separates Objekt, das gleichuist,
Assignable<T, U>
ist nur dann erfüllt, wenn
- std:: addressof ( t = u ) == std:: addressof ( o ) (d.h., der Zuweisungsausdruck ergibt einen Lvalue, der auf den linken Operanden verweist);
-
Nach Auswertung von
t
=
u
:
-
tist gleichu2, es sei denn,uist ein non-const Xvalue, der aufoverweist (d.h., die Zuweisung ist eine Selbst-Zuweisung durch Verschiebung), -
wenn
uein Glvalue ist:- Wenn es ein non-const Xvalue ist, befindet sich das Objekt, auf das es verweist, in einem gültigen, aber nicht spezifizierten Zustand;
- Andernfalls ist das Objekt, auf das es verweist, nicht modifiziert;
-
Es muss keine Subsumptionsbeziehung zwischen
Assignable<T, U>
und
std::
is_lvalue_reference
<
T
>
::
value
bestehen.
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.
Hinweise
Eine Ableitungsbedingung der Form
{
expression
}
-
>
Same
<
T
>
&&
erfordert effektiv, dass
decltype
(
(
expression
)
)
&&
exakt derselbe Typ wie
T&&
ist. Dies beschränkt sowohl den Typ des Ausdrucks als auch seine Wertkategorie.
Die Zuweisung muss keine totale Funktion sein. Insbesondere, wenn die Zuweisung zu einem Objekt
x
die Änderung eines anderen Objekts
y
verursachen kann, dann liegt
x
=
y
wahrscheinlich nicht im Definitionsbereich von
=
. Dies tritt typischerweise auf, wenn der rechte Operand direkt oder indirekt im Besitz des linken Operanden ist (z.B. bei Smart Pointern zu Knoten in einer knotenbasierten Datenstruktur, oder mit etwas wie
std::
vector
<
std::
any
>
).