Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(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 Objekt o verweist,
  • u , ein Ausdruck, für den decltype ( ( u ) ) den Typ U hat,
  • u2 , ein separates Objekt, das gleich u ist,

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 :
    • t ist gleich u2 , es sei denn, u ist ein non-const Xvalue, der auf o verweist (d.h., die Zuweisung ist eine Selbst-Zuweisung durch Verschiebung),
    • wenn u ein 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 > ).