Namespaces
Variants

std::experimental::ranges:: Writable

From cppreference.net
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 ) ;
} ;

/* keine der vier oben genannten Ausdrücke muss gleichheitserhaltend sein */
(ranges TS)

Das Konzept Writable<Out, T> spezifiziert die Anforderungen zum Schreiben eines Werts, dessen Typ und Wertkategorie durch T kodiert sind, in das referenzierte Objekt eines Iterators Out .

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

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

o muss nach der Auswertung eines der obigen Zuweisungsausdrücke nicht dereferenzierbar sein. Wenn E ein X-Wert ist, ist der resultierende Zustand des bezeichneten Objekts gültig aber unspezifiziert.

Gleichheitserhaltung

Ein Ausdruck ist equality preserving , 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.

Hinweise

Die einzige gültige Verwendung von operator * ist auf der linken Seite eines Zuweisungsausdrucks. Die Zuweisung durch 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 oberflächlich ist. Siehe Ranges TS Issue 381 .