Espacios de nombres
Variantes
Acciones

std::indirectly_writable

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
indirectly_writable
(C++20)
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)
 
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.

[editar] 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:

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.

[editar] 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.

[editar] 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.