std:: indirectly_writable
|
Definiert in Header
<iterator>
|
||
|
template
<
class
Out,
class
T
>
concept indirectly_writable
=
|
(seit C++20) | |
Das Konzept
indirectly_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
.
Semantische Anforderungen
Sei
e
ein Ausdruck, sodass
decltype
(
(
e
)
)
gleich
T
ist, und
o
ein dereferenzierbares Objekt vom Typ
Out
, dann wird
indirectly_writable
<
Out, T
>
nur modelliert, wenn:
-
Wenn
std::
indirectly_readable
<
Out
>
modelliert wird und
std::
iter_value_t
<
Out
>
denselben Typ wie
std::
decay_t
<
T
>
hat, dann ist
*
o
nach jeder obigen Zuweisung gleich dem Wert von
evor 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 Objekts, das es bezeichnet, gültig aber unspezifiziert.
Gleichheitserhaltung
Ausdrücke, die in requires expressions der Standardbibliothek-Konzepte deklariert werden, müssen equality-preserving sein (sofern nicht anders angegeben).
Hinweise
Die einzige gültige Verwendung von operator * ist auf der linken Seite eines Zuweisungsausdrucks. Die Zuweisung durch denselben Wert eines indirekt beschreibbaren Typs darf nur einmal erfolgen.
Die erforderlichen Ausdrücke mit
const_cast
verhindern, dass
indirectly_readable
-Objekte mit Prvalue-
reference
-Typen versehentlich die syntaktischen Anforderungen von
indirectly_writable
erfüllen, während Proxy-Referenzen weiterhin funktionieren, solange ihre Constness oberflächlich ist. Siehe
Ranges TS Issue 381
.
struct Object { Object& operator=(const Object& other) = default; int x; }; struct ProxyReference { ProxyReference& operator=(const ProxyReference& other) = default; const ProxyReference& operator=(const Object& o) const { *p = o; return *this; } Object* p; }; struct I1 { Object& operator*(); }; struct I2 { Object operator*(); }; struct I3 { ProxyReference operator*(); }; static_assert(std::indirectly_writable<I1, Object>); static_assert(!std::indirectly_writable<I2, Object>); static_assert(std::indirectly_writable<I3, Object>); static_assert(!std::indirectly_writable<I3, ProxyReference>); void f(I1 i1, I2 i2, I3 i3, Object o) { *i1 = o; // OK, weist dem durch *i1 referenzierten Wert zu *i2 = o; // OK, aber bedeutungslos: Dies weist dem temporären Objekt zu, das von *i2 zurückgegeben wird *i3 = o; // OK, ruft ProxyReference::operator=(const Object& o) const auf // was *ptr = o ausführt, wobei ptr (*i3).p ist }