std::indirectly_writable
Определён в заголовочном файле <iterator> | ||
|---|---|---|
template< class Out, class T >
concept indirectly_writable =
requires(Out&& o, T&& t) {
*o = std::forward<T>(t);
*std::forward<Out>(o) = std::forward<T>(t);
const_cast<const std::iter_reference_t<Out>&&>(*o) = std::forward<T>(t);
const_cast<const std::iter_reference_t<Out>&&>(*std::forward<Out>(o)) =
std::forward<T>(t);
};
/* none of the four expressions above are required to be equality-preserving */
| (начиная с C++20) |
Концепт indirectly_writable<Out, T> задаёт требования к записи значения, тип и категория значения которого закодированы в T, в объект, на который ссылается итератор Out.
Семантические требования
Пусть e — выражение, такое что decltype((e)) является T, а o — разыменовываемый объект типа Out; тогда indirectly_writable<Out, T> моделируется только в том случае, если:
- Если
std::indirectly_readable<Out>моделируется иstd::iter_value_t<Out>имеет тот же тип, что иstd::decay_t<T>, то*oпосле любого из перечисленных выше присваиваний равно значениюeдо присваивания.
Не требуется, чтобы o оставалось разыменовываемым после вычисления любого из перечисленных выше выражений присваивания. Если e является xvalue, результирующее состояние обозначаемого им объекта допустимо, но не определено.
Сохранение равенства
Выражения, объявленные в requires-выражениях концептов стандартной библиотеки, должны сохранять равенство (за исключением случаев, когда указано иное).
Примечания
Единственное допустимое применение operator* — в левой части выражения присваивания. Присваивание через одно и то же значение типа, удовлетворяющего indirectly writable, может выполняться только один раз.
Требуемые выражения с const_cast не позволяют объектам indirectly_readable с типами reference prvalue случайно удовлетворять синтаксическим требованиям indirectly_writable, одновременно позволяя прокси-ссылкам продолжать работать, если их константность является поверхностной. См. обсуждение 381 в Ranges TS.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/indirectly_writable