¿Cuál es la forma correcta de reutilizar un contenedor movido?
std::vector<int> container;
container.push_back(1);
auto container2 = std::move(container);
// ver1: Do nothing
//container2.clear(); // ver2: "Reset"
container = std::vector<int>() // ver3: Reinitialize
container.push_back(2);
assert(container.size() == 1 && container.front() == 2);
Por lo que he leído en el borrador estándar C ++ 0x; ver3 parece ser la forma correcta, ya que un objeto después del movimiento está en un
"A menos que se especifique lo contrario, dichos objetos de origen se colocarán en un estado válido pero no especificado".
Nunca he encontrado ninguna instancia donde esté "especificado de otra manera".
Aunque encuentro ver3 un poco indirecto y preferiría ver1 mucho, aunque vec3 puede permitir alguna optimización adicional, pero por otro lado puede conducir fácilmente a errores.
¿Es correcta mi suposición?
fuente
clear
, ya que no tiene condiciones previas (y, por lo tanto, no depende del estado del objeto).std::vector
implementación que almacenó un puntero a su tamaño (parece tonto, pero legal). Moverse desde ese vector podría dejar el puntero NULL, después de lo cualclear
fallaría.operator=
también podría fallar.