mundo - ¿Por qué la semántica de movimientos de C++ deja la fuente construida?
manual completo de c++ pdf (1)
En el "universo de operaciones de movimiento" hay cuatro posibilidades:
target source
is is left
----------------------------------------------------------
constructed <-- constructed // C++11 -- move construction
constructed <-- destructed
assigned <-- constructed // C++11 -- move assignment
assigned <-- destructed
¡Cada una de estas operaciones es útil! std::vector<T>::insert
solo puede hacer uso de los tres primeros. Aunque nota:
- La fuente del segundo y cuarto no debe tener una duración de almacenamiento automática, estática o de subprocesos. La duración del almacenamiento de la fuente debe ser dinámica, de lo contrario el compilador llamará al destructor en el objeto ya destruido. Y no, el compilador no puede realizar un seguimiento (en general) si un objeto se ha movido desde:
X x1, x2;
if (sometimes)
{
x1 = std::move(x2);
}
// Is x2 moved-from here?
El 2º y el 4º pueden ser emulados por el 1º y 3º respectivamente, simplemente llamando manualmente al destructor en la fuente después de la operación.
El primero y el tercero son cruciales. Algoritmos como
std::swap
ystd::sort
regularmente necesitan estas dos operaciones. Estos algoritmos no necesitan destruir ninguno de sus objetos de entrada, solo cambian sus valores.
Armado con este conocimiento, en el marco de tiempo 2001-2002 centré mis esfuerzos en las dos operaciones que dejaron su fuente construida porque estas dos operaciones tendrían el mayor impacto (positivo) en lo que entonces era C ++ 98. En ese momento supe que si no recortaba las ambiciones de este proyecto, nunca tendría éxito. Incluso recortado, era demasiado ambicioso para tener éxito.
Esta reducción se reconoce en la propuesta de semántica de movimiento original en la sección titulada "Semántica de movimiento destructivo".
Al final, simplemente renunciamos a esto como demasiado dolor para no obtener suficiente ganancia. Sin embargo, la propuesta actual no prohíbe la semántica de movimientos destructivos en el futuro. Se podría hacer además de la semántica de movimientos no destructivos que se describe en esta propuesta si alguien desea llevar esa antorcha.
Para obtener más detalles sobre lo que se puede hacer con un objeto movido desde, consulte https://stackoverflow.com/a/7028318/576911
En C ++ 11, se introdujo "semántica de movimiento", implementado a través de los dos miembros especiales: constructor de movimiento y asignación de movimiento. Ambas operaciones dejan el objeto movido desde construido.
¿No habría sido mejor dejar la fuente en un estado destruido? ¿No es lo único que puedes hacer con un objeto movido de destruirlo de todos modos?