std::experimental::ranges::Writable
| Definiert in Header <experimental/ranges/iterator> |
||
| template< class Out, class T > concept bool Writable = |
(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
Evor 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.