funciones examples c++ lambda c++11

c++ - examples - ¿Es válido que una lambda, esencialmente, se cierre sobre sí misma?



lambda examples c++ (1)

¿Es válida esta recursividad lambda?

#include <functional> #include <iostream> int main() { std::function<int(int)> g = [&g](int k) { return (k ? k * g(k-1) : 1); }; std::cout << g(10); // 3628800 }

Parece compilar y ejecutar bien , pero estoy nervioso acerca de cerrar g en la misma declaración que lo inicializo. ¿Estricta validez en una escala de 1-10 ...?


En el punto en el que captura g por referencia, se ha declarado, por lo que el nombre está disponible para su uso:

3.3.2 / 1 El punto de declaración para un nombre es inmediatamente después de su declarador completo (cláusula 8) y antes de su inicializador

Se le permite usar objetos de manera limitada antes de que se inicialicen; básicamente, cualquier cosa que no dependa del valor está OK:

3.8 / 6 antes de que haya comenzado la vida útil de un objeto, pero después de que se haya asignado el almacenamiento [...] que ocupará el objeto, se puede usar cualquier valor de gl que se refiera al objeto original, pero solo de forma limitada. [...] usar las propiedades del glvalue que no dependen de su valor está bien definido.

Entonces, según entiendo, lo que estás haciendo está bien definido.

(Aunque, siendo ultrapedante, no creo que se especifique cuando se asigna el almacenamiento de un objeto automático, y 8.3.2 / 5 dice que "una referencia se debe inicializar para referirse a un objeto válido" sin definir "válido", así que hay margen para argumentar que no está bien definido).