std::indirectly_writable
| Definido en el archivo de encabezado <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); }; // no se requiere que ninguna de las cuatro expresiones anteriores sea conservadora de igualdad |
(desde C++20) | |
El concepto indirectly_writable<Out, T> (indirectamente escribible) especifica los requerimientos para escribir un valor cuyo tipo y categoría de valor se codifican por T en el objeto al que hace referencia un iterador Out.
Requerimientos semánticos
Dejemos que e sea una expresión tal que decltype((e)) es T, y o es un objeto desreferenciable de tipo Out, entonces indirectly_writable<Out, T> se modela solo si:
- Si se modela
std::indirectly_readable<Out>ystd::iter_value_t<Out>es el mismo tipo questd::decay_t<T>, entonces*odespués de cualquiera de las asignaciones anteriores es igual al valor deeantes de la asignación.
No se requiere que o sea desreferenciable después de evaluar cualquiera de las expresiones de asignación anteriores. Si e es un xvalue, el estado resultante del objeto que denota es válido pero sin especificar.
Conservación de la igualdad
Una expresión es conservadora de igualdad si resulta en salidas iguales dadas entradas iguales.
- Las entradas de una expresión consisten en sus operandos.
- Las salidas de una expresión consisten en su resultado y todos los operandos modificados por la expresión (si es que los hay).
Cada expresión que se requiere sea conservadora de igualdad, se requiere además que sea estable: dos evaluaciones de tal expresión con los mismos objetos de entrada debe tener salidas iguales si no se encuentra alguna modificación interventora de esos objetos de entrada.
Notas
El único uso válido de operator* es en el lado izquierdo de una expresión de asignación. La asignación a través del mismo valor de un tipo indirectamente escribible puede suceder solamente una vez.
Las expresiones requeridas con const_cast previenen que los objetos indirectly_readable con tipos referencia prvalue reference satisfagan los requerimientos sintácticos de indirectly_writable por accidente, mientras que permiten que referencias proxy sigan funcionando siempre y cuando su constancia (constness) sea superficial. Véase Ranges TS problema 381.