Tag: MOVE-SEMANTICS
Creo recordar que alguien me dijo que estos dos métodos foo(std::vector<int>&& v) { member = std::move(v); } bar(std::vector<int> v) { member = std::move(v); } no invocarán una copia si hay un movimiento en el lugar de llamada. foo(std::move(v1)); bar(std::move(v2)); ya que el compilador optimizará la llamada y tratará el caso . . . Read more
En el siguiente programa pequeño tengo dos ejemplos de uso de move con shared_ptr. El primer ejemplo se comporta como esperaba y la propiedad del shared_ptr p se le asigna al nuevo puntero p2. Después de la asignación, p es un puntero inválido. Esperaría que lo mismo suceda también en . . . Read more
Haciendo un análisis de código en PVS-Studio, me dio algunos mensajes de advertencia. Tengo la siguiente declaración en un archivo de encabezado: constexpr int MIN_ALLOWED_Y { 0 }; Y en un archivo fuente: std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) ) En la expresión anterior, utilicé std::move . . . Read more
¿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 . . . Read more
Tengo dos piezas de código similares. La primera versión llama inesperadamente al constructor predeterminado mientras que la segunda no lo hace. Ambas llaman al operador de movimiento / constructor de movimiento, respectivamente, como se esperaba. class MyResource { public: MyResource() : m_data(0) { std::cout << “Constructor Predeterminado” << std::endl; } . . . Read more