Articles of movimiento semántica

¿Por qué std :: move previene RVO?

En muchos casos, al devolver un local desde una función, RVO entra en acción. Sin embargo, pensé que el uso explícito de std::move al menos impondría la mudanza cuando no ocurra el RVO, pero ese RVO aún se aplica cuando es posible. Sin embargo, parece que este no es el caso. #include “iostream” class HeavyWeight […]

¿Qué garantiza la biblioteca estándar sobre la asignación de movimiento automático?

¿Qué dice el estándar C ++ 11 sobre la asignación del movimiento personal en relación con la biblioteca estándar? Para ser más concretos, ¿qué se garantiza, en todo caso, sobre lo que hace selfAssign ? template std::vector selfAssign(std::vector v) { v = std::move(v); return v; }

¿Por qué usas std :: move cuando tienes && en C ++ 11?

Posible duplicado: ¿Alguien puede explicarme la semántica del movimiento? Recientemente asistí a un seminario de C ++ 11 y recibí el siguiente consejo. when you have && and you are unsure, you will almost always use std::move ¿Podría alguien explicarme por qué debería usar std::move en lugar de algunas alternativas y algunos casos en los […]

¿Cómo implementar realmente la regla de cinco?

ACTUALIZAR en la parte inferior q1: ¿Cómo implementaría la regla de cinco para una clase que maneja recursos bastante pesados, pero de los cuales quiere que se transmita por valor porque eso simplifica y embellece su uso? ¿O no son necesarios los cinco elementos de la regla? En la práctica, estoy comenzando algo con imágenes […]

¿Por qué copiamos y luego nos movemos?

Vi un código en el que alguien decidió copiar un objeto y luego moverlo a un miembro de datos de una clase. Esto me dejó en la confusión en que pensé que todo el punto de movimiento era evitar copiar. Aquí está el ejemplo: struct S { S(std::string str) : data(std::move(str)) {} }; Aquí están […]

¿El vector movido siempre está vacío?

Sé que, en general, la norma impone pocos requisitos sobre los valores que se han movido de: N3485 17.6.5.15 [lib.types.movedfrom] / 1: Los objetos de tipos definidos en la biblioteca estándar de C ++ se pueden mover desde (12.8). Las operaciones de movimiento pueden especificarse explícitamente o generarse implícitamente. A menos que se especifique lo […]

¿Reutilizando un contenedor movido?

¿Cuál es la forma correcta de reutilizar un contenedor movido? std::vector container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: “Reset” container = std::vector() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); De lo que he leído en el borrador estándar de C ++ 0x; ver3 parece ser […]

¿El movimiento deja el objeto en un estado utilizable?

Digamos que tengo dos vectores y muevo uno hacia el otro, v1 = std::move(v2) ; v2 todavía estará en un estado utilizable después de esto?

¿Hay algún caso en que una devolución de una referencia de RValue (&&) sea útil?

¿Hay alguna razón por la cual una función debería devolver una Referencia de RValue ? Una técnica, o truco, o una expresión idiomática o un patrón? MyClass&& func( … ); Soy consciente del peligro de devolver referencias en general, pero a veces lo hacemos de todos modos, ¿no? ( T& T::operator=(T) es solo un ejemplo […]

¿Cuáles son las reglas para la generación automática de operaciones de movimiento?

En C ++ 98, el comstackdor de C ++ podría generar automáticamente el constructor de copias y el operador de asignación de copias a través de una copia de miembros, por ejemplo struct X { std::string s; std::vector v; int n; }; El comstackdor genera automáticamente el constructor de copias y el operador de asignación […]