std::experimental::ranges:: Assignable
|
Definido en el encabezado
<experimental/ranges/concepts>
|
||
|
template
<
class
T,
class
U
>
concept
bool
Assignable
=
|
(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 objetoo, -
u, una expresión tal que decltype ( ( u ) ) esU, -
u2, un objeto distinto que es igual au,
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
:
-
tes igual au2, a menos queusea un xvalue no constante que se refiera ao(es decir, la asignación es una auto-asignación de movimiento), -
si
ues 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
>
).