compiler - ¿Por qué mover la captura no es compatible con C++ lambda?
c++17 (1)
La especificación de C ++ intenta ser bastante conservadora. Es realmente malo que la próxima especificación de idioma rompa los programas que cumplían con la especificación anterior.
Mover la semántica tomó un tiempo para madurar. Hubo cambios tan tarde como 2009, si recuerdo. Mientras tanto, los lambdas no se implementaron en muchos compiladores hasta un período de tiempo similar. No había tiempo para llenar los vacíos y aún lanzar un estándar en 2011, que ya era muy tarde. (Prototipo de la especificación con los compiladores, prueba los compiladores, retrocede y debate la especificación, el borrador, el prototipo, la prueba, repite. Toma un rato).
Lambdas se ampliará en gran medida en el próximo estándar, obteniendo una deducción de tipo ( auto
polimorfismo). Xeo menciona una solución potencial para mover la inicialización.
Tenga en cuenta que las lambdas son sólo azúcar sintáctica. Se especifican en términos de una clase definida automáticamente, pero no contienen nada que no pueda hacer usted mismo. En cuanto al estándar de lenguaje actual, se espera que usted complete manualmente esa implementación cuando se agote el nivel de azúcar.
Por cierto, es posible que pueda evitar la función que falta al capturar un auto_ptr
antiguo, que es el intento ahora desaprobado de C ++ 03 de un puntero inteligente. Se invalida por su propio constructor de copia, esencialmente implementando mover en copia. Pero está en desuso por C ++ 11 y puede causar advertencias. Sin embargo, podrías intentar implementar algo similar.
El estándar actual de C ++ 11 no admite la captura de movimiento de variables en la expresión lambda como
unique_ptr<int[]> msg(new int[1000000]);
async_op([&&msg] { // compile error : move capture is not supported
/* do something */
});
Dado que el paso de mensajes y la propiedad única tienen un papel fundamental en el diseño de algunos sistemas asíncronos, creo que mover semántica se debe tratar como lenguaje semántico de primera clase. Pero lambda no soporta la captura de movimiento.
Por supuesto, sé que hay una solución alternativa al uso del proxy de captura de movimiento, pero me pregunto la razón de la decisión de que esta funcionalidad no se incluya en el estándar C ++ 11, a pesar de su importancia.