c++ - Mover la semántica con un miembro std:: vector
move constructor c++ (1)
Si no escribe ningún constructor explícito de copia o movimiento ni ningún operador de asignación de copia o movimiento ni un destructor, entonces el constructor de movimiento provisto por defecto mueve los elementos uno por uno. Para más detalles, ver 12.8.9.
Dado que define su propio constructor de copia, no obtendrá un constructor de movimiento de forma predeterminada. Defina uno (quizás = default
) o elimine el constructor de copia explícito.
Las clases bien compuestas generalmente no deberían necesitar Big Five personalizados, y en cambio confían en los miembros que las proporcionan y usan la versión predeterminada.
Lo siento si esto se ha pedido antes, pero como lo entiendo, en C ++ 11, std::vector
tiene un constructor de movimientos por lo que las copias apenas cuestan nada en ciertas situaciones, como devolver uno por valor. Sin embargo, si tengo una clase como esta, con un vector
como variable miembro:
class MyClass {
public:
MyClass() { }
MyClass(const MyClass& rhs) { }
// other interfaces
private:
std::vector<int> myvec;
// implementation
};
Y tiene una función que devuelve uno de estos por valor, como
MyClass somefunc() {
MyClass mc;
// fill mc.myvec with thousands (maybe even millions) of ints
return mc;
}
¿Se llamará al constructor de movimientos de mc.myvec
se mc.myvec
el constructor de movimientos de std::vector
aunque MyClass
no sepa nada sobre los constructores de movimientos? ¿O se llamará al constructor de copia de vector
y todos esos miles (tal vez incluso millones) de int
deben copiarse uno por uno?