Espacios de nombres
Variantes

std::indirectly_writable

De cppreference.com
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
<tbody> </tbody>
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> y std::iter_value_t<Out> es el mismo tipo que std::decay_t<T>, entonces *o después de cualquiera de las asignaciones anteriores es igual al valor de e antes 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.