Namensräume
Varianten
Aktionen

std::experimental::ranges::Writable

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Iterator-Bibliothek
Iterator-Konzepte
Indirekte aufrufbare Konzepte
                                                  
                                                  
                                                  
Gemeinsame Algorithmus-Anforderungen
                                                  
Konzept-Dienstprogramme
Iterator-Dienstprogramme und -Operationen
Iterator-Traits
Iterator-Adapter
Stream-Iteratoren
 
Definiert in Header <experimental/ranges/iterator>
template< class Out, class T >

concept bool Writable =
    requires(Out&& o, T&& t) {
        *o = std::forward<T>(t);
        *std::forward<Out>(o) = std::forward<T>(t);
        const_cast<const ranges::reference_t<Out>&&>(*o) =
            std::forward<T>(t);
        const_cast<const ranges::reference_t<Out>&&>(*std::forward<Out>(o)) =
            std::forward<T>(t);
    };

    /* keines der vier obigen Ausdrücke muss gleichheitserhaltend sein */
(Ranges TS)

Das Konzept Writable<Out, T> spezifiziert die Anforderungen für das Schreiben eines Wertes, dessen Typ und Wertkategorie durch T kodiert sind, in ein Objekt, auf das ein Iterator Out verweist.

Sei E ein Ausdruck, so dass decltype((E)) gleich T ist und o ein dereferenzierbares Objekt vom Typ Out ist, dann ist Writable<Out, T> nur dann erfüllt, wenn

  • Wenn Readable<Out> && Same<ranges::value_type_t<Out>, std::decay_t<T>> erfüllt ist, dann ist *o nach einer obigen Zuweisung gleich dem Wert von E vor der Zuweisung.

Es wird nicht erwartet, dass o nach der Auswertung eines der obigen Zuweisungsausdrücke dereferenzierbar ist. Wenn E ein xvalue ist, ist der resultierende Zustand des Objekts, auf das es verweist, gültig, aber nicht spezifiziert.

[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.

[bearbeiten] Hinweise

Die einzig zulässige Verwendung von operator* ist auf der linken Seite eines Zuweisungsausdrucks. Eine Zuweisung über denselben Wert eines beschreibbaren Typs darf nur einmal erfolgen.

Die erforderlichen Ausdrücke mit const_cast verhindern, dass Readable-Objekte mit prvalue reference-Typen versehentlich die syntaktischen Anforderungen von Writable erfüllen, während Proxy-Referenzen weiterhin funktionieren, solange ihre constness flach ist. Siehe Ranges TS issue 381.