c++ - que - ¿Qué garantiza la biblioteca estándar sobre la asignación de movimiento automático?
librerias dev c++ pdf (2)
¿Qué dice el estándar C ++ 11 sobre la asignación del movimiento personal en relación con la biblioteca estándar? Para ser más concretos, ¿qué se garantiza, en todo caso, sobre lo que hace selfAssign
?
template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
v = std::move(v);
return v;
}
17.6.4.9 Argumentos de la función [res.on.arguments]
1 Cada uno de los siguientes se aplica a todos los argumentos a las funciones definidas en la biblioteca estándar de C ++, a menos que se indique explícitamente lo contrario.
...
- Si un argumento de función se une a un parámetro de referencia rvalue, la implementación puede suponer que este parámetro es una referencia única a este argumento. [Nota: si el parámetro es un parámetro genérico de la forma T && y un valor l de tipo A está vinculado, el argumento se vincula a una referencia de valor l (14.8.2.1) y, por lo tanto, no está cubierto por la oración anterior. - nota final] [Nota: si un programa arroja un valor l a un valor x mientras pasa ese valor l a una función de biblioteca (por ejemplo, llamando a la función con el argumento movimiento (x)), el programa efectivamente está pidiendo esa función para tratar ese valor como un temporal. La implementación es gratuita para optimizar las comprobaciones de aliasing que podrían ser necesarias si el argumento fuera un valor. -finalización]
Entonces, la implementación de std::vector<T, A>::operator=(vector&& other)
puede suponer que other
es un valor prve. Y si other
es un valor prve, la asignación de movimiento propio no es posible.
Qué es probable que suceda:
v
se dejará en un estado sin recursos (capacidad 0). Si v
ya tiene 0 capacidad, entonces esto no será operativo.
Actualizar
El último borrador de trabajo, N4618 se ha modificado para indicar claramente que en los requisitos de MoveAssignable
la expresión:
t = rv
(donde rv
es un valor r), t
solo necesita ser el valor equivalente de rv
antes de la asignación si t
y rv
no hacen referencia al mismo objeto. E independientemente, el estado de rv
no se especifica después de la asignación. Hay una nota adicional para mayor aclaración:
rv
aún debe cumplir con los requisitos del componente de la biblioteca que lo usa, independientemente de sit
yrv
refieren al mismo objeto.
Nada pasará. Un operador de asignación inteligente puede devolver inmediatamente si &other == this
. De lo contrario, les asignará sus partes internas, sin hacer nada.