es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El calificador const aplicado a Foo& foo2 solo marca la referencia en sí como constante, no el objeto subyacente. En otras palabras, no se puede volver a asignar foo2 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 como std::move.

    En este caso, std::move no modifica realmente los elementos de foo2.bar. Simplemente los mueve al vector target, dejando foo2.bar en un estado válido pero no especificado. Por lo tanto, el código se compila y se ejecuta sin problemas.

Comments are closed.