Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
Definido en el encabezado <experimental/ranges/concepts>
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(ranges TS)

El concepto Assignable<T, U> especifica que una expresión del tipo y categoría de valor especificados por U puede ser asignada a una expresión lvalue cuyo tipo está especificado por T .

Dado

  • t , un lvalue de tipo std:: remove_reference_t < T > que hace referencia a un objeto o ,
  • u , una expresión tal que decltype ( ( u ) ) es U ,
  • u2 , un objeto distinto que es igual a u ,

Assignable<T, U> se satisface solo si

  • std:: addressof ( t = u ) == std:: addressof ( o ) (es decir, la expresión de asignación produce un lvalue que se refiere al operando izquierdo);
  • Después de evaluar t = u :
    • t es igual a u2 , a menos que u sea un xvalue no constante que se refiera a o (es decir, la asignación es una auto-asignación de movimiento),
    • si u es un glvalue:
      • Si es un xvalue no constante, el objeto al que se refiere está en un estado válido pero no especificado;
      • En caso contrario, el objeto al que se refiere no está modificado;

No es necesario que exista ninguna relación de subsunción entre Assignable<T, U> y std:: is_lvalue_reference < T > :: value .

Preservación de la igualdad

Una expresión es equality preserving si produce 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 los hay).

Toda expresión que deba preservar la igualdad debe además ser estable : dos evaluaciones de dicha expresión con los mismos objetos de entrada deben producir salidas iguales, en ausencia de cualquier modificación explícita intermedia de esos objetos de entrada.

A menos que se indique lo contrario, cada expresión utilizada en una requires-expression debe ser de preservación de igualdad y estable, y la evaluación de la expresión solo puede modificar sus operandos no constantes. Los operandos que son constantes no deben modificarse.

Notas

Una restricción de deducción de la forma { expression } - > Same < T > && efectivamente requiere que decltype ( ( expression ) ) && sea exactamente el mismo tipo que T&& . Esto restringe tanto el tipo de la expresión como su categoría de valor.

La asignación no necesita ser una función total. En particular, si asignar a algún objeto x puede causar que otro objeto y sea modificado, entonces x = y probablemente no esté en el dominio de = . Esto típicamente ocurre si el operando derecho es poseído directa o indirectamente por el operando izquierdo (por ejemplo, con punteros inteligentes a nodos en una estructura de datos basada en nodos, o con algo como std:: vector < std:: any > ).