Ответ 1
Lambda scope может неявно захватывать переменные в пределах своей области охвата.
Ваши переменные находятся в области охвата, поскольку они локальны для (основной) функции, которая определяет лямбда.
Однако существуют определенные критерии, в которых переменные могут быть захвачены с помощью этого механизма, как указано в [expr.prim.lambda]/12
Лямбда-выражение с ассоциированным захватом-умолчанию, которое не явно фиксировать эту или переменную с автоматической продолжительностью хранения [..], говорится неявно захватить объект (т.е. эту или переменную ), если соединение-оператор:
-odr-uses ([basic.def.odr]) объект или
-значает объект в потенциально-оцененном выражении ([basic.def.odr]), где охватывающее полное выражение зависит от общий параметр лямбда, объявленный в пределах охвата лямбда-выражение.
Самая важная часть - [expr.const]/2.7:
условное выражение
e
является выражением константы основной константы, если только оценкаe
, [..] будет оценивать одно из следующих выражений:преобразование lvalue-to-rvalue ([conv.lval]), если оно не применяется к:
нестабильное значение gl интегрального или перечисления типа, которое относится к энергонезависимому объекту const с предшествующей инициализацией, инициализируется постоянным выражением.
So const int
- это основное выражение константы, а const float
- нет.
Более того [expr.const] 1826 упоминает:
Сопряженное целое число, инициализированное константой, может использоваться в константных выражениях, но переменная с плавающей запятой const, инициализированная константой, не может.
Подробнее в Почему переменная const иногда не требуется записывать в лямбда?