¿Por qué puedo mover elementos de un vector constante utilizando std::move?
¿Por qué se compila el siguiente código?
#include <vector>
#include <iostream>
struct Foo {
std::vector<int> bar = {1, 2, 3};
};
int main()
{
Foo foo1;
const Foo& foo2 = foo1;
std::vector<int> target;
std::move(foo2.bar.begin(), foo2.bar.end(), std::back_inserter(target));
return 0;
}
La documentación de std::move dice:
Después de esta operación, los elementos en el rango movido todavía contendrán valores válidos del tipo correspondiente, pero no necesariamente los mismos valores que antes del movimiento.
Por lo tanto, esto puede cambiar el objeto foo2
aunque esté declarado como constante. ¿Por qué funciona esto?
davy.ai
El calificador
const
aplicado aFoo& foo2
solo marca la referencia en sí como constante, no el objeto subyacente. En otras palabras, no se puede volver a asignarfoo2
a otro objeto, pero el objeto al que hace referencia aún se puede modificar a través de funciones miembro no constantes o mediante operaciones no constantes comostd::move
.En este caso,
std::move
no modifica realmente los elementos defoo2.bar
. Simplemente los mueve al vectortarget
, dejandofoo2.bar
en un estado válido pero no especificado. Por lo tanto, el código se compila y se ejecuta sin problemas.