В вашем коде был UB для относительно короткого окна.В первоначальных правилах лямбда-захвата по ссылке указывалось, что ссылка действительна только до тех пор, пока захваченная переменная не выйдет из области видимости.
Это может привести к некоторому виду захвата по ссылке,иначе невозможно в стандарте C ++.(Самое близкое, что вы могли бы получить, это ссылка на структуру с одним членом, содержащую ссылку)
Теоретически, вы можете использовать этот факт, чтобы сделать лямбда-захват захвата ссылок основанным на стековом фрейме;захватить текущий кадр стека, и все (почти?) аргументы ссылки-ссылки будут иметь фиксированные смещения к этому кадру стека.
Поскольку большинство (все?) ABI реализуют ссылочные аргументы как указатели под капотом, это будетприводить к ссылочным аргументам к функциям-аргументам, которые являются ссылками, висящими после того, как вернулась лямбда.
Ни один компилятор не использовал этот факт .Та оптимизация никогда не использовалась, она просто наблюдалась как возможно.Правило «захват ссылки лямбды имеет время жизни переменной ссылки» никогда не использовалось никаким компилятором (или, по крайней мере, любым, о котором я слышал).
Когда он был обнаружен, он был разрешен как исправление дефекта.в стандарте, что означает, что он задним числом переопределил то, что означало c ++ 11 .
Так что в то время как при историческом компиляторе c ++ 11 это было технически UB, никакого текущегосовместимый c ++ 11 компилятор может рассматривать его как UB, и все исторические компиляторы C ++ 11 обрабатывают его так же, как и современные компиляторы.Так что вы в безопасности.