Я думаю, вы путаете механизм захвата с механизмом передачи переменных. Они не одно и то же, даже если они имеют внешнее сходство друг с другом. Если вам нужно текущее значение переменной внутри лямбда-выражения, перехватите его по ссылке (хотя, конечно, эта ссылка привязана к определенной переменной в точке, где объявлена лямбда).
Когда вы «захватываете» переменную, вы создаете нечто очень похожее на замыкание. И замыкания всегда статически ограничены (т. Е. «Захват» происходит в точке объявления). Люди, знакомые с концепцией лямбда-выражения, сочтут лямбда-выражения C ++ весьма странными и сбивающими с толку, если бы это было иначе. Добавление совершенно новой функции к языку программирования, которая отличается от той же функции в других языках программирования каким-либо существенным образом, сделает C ++ еще более запутанным и трудным для понимания, чем он есть. Кроме того, все остальное в C ++ имеет статическую область видимости, поэтому добавление некоторого элемента динамической области видимости также будет очень странным по этой причине.
Наконец, если захват всегда происходит по ссылке, то это будет означать, что лямбда будет действительна только до тех пор, пока действителен кадр стека. Либо вам придется добавить в C ++ кадры стека для сбора мусора (с огромным ударом по производительности и большим криком от людей, которые в основном зависят от стека), либо вы в конечном итоге создадите еще одну функцию, в которой было бы несложно легко взорвать ваш Случайно начните с базуки, так как кадр стека, на который ссылается лямбда-выражение, выйдет из области видимости, и вы в основном создадите множество невидимых возможностей для возврата локальных переменных по ссылке.