Namensräume
Varianten
Aktionen

std::experimental::ranges::Assignable

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Konzeptbibliothek
Kernsprachen-Konzepte
                              
Objektkonzepte
                              
                              
Vergleichskonzepte
Aufrufbare Konzepte
                                        
                              
URNG-Konzept
 
Definiert in Header <experimental/ranges/concepts>
template< class T, class U >

Konzept 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 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 Objekt o verweist,
  • u, ein Ausdruck, für den gilt decltype((u)) gleich U ist,
  • u2, ein von u unterschiedliches 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 ein Lvalue, das auf den linken Operanden verweist);
  • Nach der Auswertung von t = u
    • t gleich u2 ist, es sei denn, u ist ein nicht-const Xvalue, das auf o verweist (d. h. die Zuweisung ist eine Selbst-Zuweisung-durch-Verschieben),
    • wenn u ein 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>).