Lambda est portée de manière implicite par la capture de variables au sein d'atteindre la portée.
Vos variables sont dans l'atteinte portée, car ils sont locales à la (principale) de la fonction qui définit le lambda.
Cependant, il ya certains critères dans les variables qui peuvent être capturés par le biais de ce mécanisme, comme mentionné dans [expr.prim.lambda]/12:
Une lambda-expression associée à une capture par défaut qui n'a pas
explicitement cette capture ou une variable avec stockage automatiquede la durée
[..], il est dit à
implicitement, la capture de l'entité (c'est à dire, ce ou une variable) si le
composé déclaration:
-odr-usages ([base.def.odr]) l'entité, ou
-les noms de l'entité à une possible évaluation de l'expression ([base.def.odr]) où la enfermant pleine expression dépend d'un
générique paramètre lambda déclarée au sein de l'atteindre champ d'application de la
la lambda-expression.
La partie la plus importante est dans [expr.const]/2.7:
Un conditionnel expression e
est une base constante de l'expression , à moins que le
l'évaluation de l' e
, [..] permettrait d'évaluer l'une des expressions suivantes:
une lvalue-à-rvalue de conversion ([conv.lval]) sauf si elle est appliquée à:
un non-volatile glvalue de l' intégrale ou une énumération de type qui fait référence à un non-volatile const objet avec un précédent initialisation,
initialisé avec une expression constante.
Donc, const int
est une base constante de l'expression tout en const float
ne l'est pas.
En outre [expr.const]1826 mentionne:
Const integer initialisé avec une constante peut être utilisé dans des expressions constantes, mais const virgule flottante variable initialisée avec une constante ne peut pas.
Lire la suite dans Pourquoi est une variable const parfois pas besoin d'être capturé dans un lambda?