¿El estándar define con precisión lo que puedo hacer con un objeto una vez que se ha movido? Solía pensar que todo lo que puedes hacer con un objeto movido es destruirlo, pero eso no sería suficiente.
Por ejemplo, tome la plantilla de función swap
como se define en la biblioteca estándar:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Obviamente, debe ser posible asignar a objetos movidos, de lo contrario las líneas 2 y 3 fallarían. Entonces, ¿qué más puedo hacer con los objetos movidos? ¿Dónde puedo encontrar exactamente estos detalles en el estándar?
(Por cierto, ¿por qué está en T c = std::move(a);
lugar de T c(std::move(a));
en la línea 1?)
fuente
pop_back
un traslado desdevector
. Pero ciertamente puedes averiguar si es asíempty()
.pop_back
desde un vacíovector
tiene un comportamiento indefinido de todos modos, desde la memoria, así que estoy bastante seguro de quepop_back
un vector movido que exhibe un comportamiento indefinido es consistente.pop_back
aún se comporta como en cualquier vector válido (incluso puede ser un vector vacío).17.6.5.15 [lib.types.movedfrom]
Cuando un objeto está en un estado no especificado, puede realizar cualquier operación en el objeto que no tenga condiciones previas. Si hay una operación con condiciones previas que desea realizar, no puede realizarla directamente porque no sabe si el estado no especificado del objeto satisface las condiciones previas.
Ejemplos de operaciones que generalmente no tienen condiciones previas:
get
,empty
,size
Ejemplos de operaciones que generalmente tienen condiciones previas:
Esta respuesta ahora aparece en formato de video aquí: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
fuente
char* buffer;
yint length;
miembros, entonces mi constructor / asignación de movimiento debe intercambiar (o establecer) el valor de ambos? ¿O estaría bien si la longitud no se especificara (lo que significa esoempty
ysize
devolvería valores sin sentido)?