En el punto en el que se captura g
por referencia, se ha declarado, por lo que el nombre está disponible para su uso:
3.3.2/1 El punto de la declaración de un nombre es inmediatamente después de su declarador completa (Cláusula 8) y antes de su inicializador
Usted está autorizado a utilizar los objetos de manera limitada antes de que se inicializan - básicamente, cualquier cosa que no depende del valor está bien:
3.8/6 antes de que se haya iniciado la vida útil de un objeto, pero después del almacenamiento que ocupará el objeto se ha asignado [...] cualquier glvalue que se refiera al objeto original pero solo en formas limitadas . [...] usar las propiedades del glvalue que no dependen de su valor está bien definido.
Por lo que entiendo, lo que está haciendo está bien definido.
(Aunque, siendo ultrapente, no creo que se especifique cuando se asigna el almacenamiento para un objeto automático, y 8.3.2/5 dice que "una referencia debe inicializarse para referirse a un objeto válido" sin definir "válido", por lo que hay margen para argumentar que no está bien definido).
En C#, eso no compilaría; necesitarías dividirlo en dos declaraciones. – SLaks
C++ 0x ejemplos [aquí] (http://zamjad.wordpress.com/2011/09/22/c-recursive-lambda-functions/) divídalo en 2 instrucciones, pero nunca explica por qué. – Joe
Creo que es un comportamiento indefinido. Lambdas no está diseñado para recursividad porque es una función anónima, ¿verdad? – Hauleth