Namespaces
Variants

std::experimental::ranges:: Writable

From cppreference.net
Определено в заголовочном файле <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 ) ;
} ;

/* ни одно из четырех выражений выше не обязано сохранять равенство */
(ranges TS)

Концепт Writable<Out, T> определяет требования для записи значения, чей тип и категория значения кодируются типом T в объект, на который ссылается итератор Out .

Пусть E будет выражением, таким что decltype ( ( E ) ) является T , и o будет разыменовываемым объектом типа Out , тогда Writable<Out, T> удовлетворяется только если:

  • Если Readable < Out > && Same < ranges :: value_type_t < Out > , std:: decay_t < T >> выполняется, тогда * o после любого вышеуказанного присваивания равно значению E до присваивания.

o не требуется быть разыменовываемым после вычисления любого из вышеприведенных выражений присваивания. Если E является xvalue, результирующее состояние объекта, который он обозначает, является допустимым, но неопределенным.

Сохранение равенства

Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.

  • Входные данные выражения состоят из его операндов.
  • Выходные данные выражения состоят из его результата и всех операндов, измененных выражением (если таковые имеются).

Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные результаты при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.

Примечания

Единственное допустимое использование operator * — в левой части выражения присваивания. Присваивание через одно и то же значение записываемого типа может произойти только один раз.

Необходимые выражения с const_cast предотвращают случайное удовлетворение синтаксических требований Readable объектов с prvalue reference типами для Writable , при этом позволяя прокси-ссылкам продолжать работать до тех пор, пока их константность является поверхностной. См. Ranges TS issue 381 .