Что произойдет, если я получу локальную переменную по ссылке, и она выйдет из области видимости? - PullRequest
18 голосов
/ 28 февраля 2012

Предположим, я использую лямбду в качестве функции обратного вызова, и при создании лямбды я фиксирую переменную локальной функции по ссылке.Теперь предположим, что лямбда-объект не выполняется до тех пор, пока локальная переменная функции не выйдет из области видимости.Что происходит?

Я понимаю, что для кого-то было бы довольно глупо делать это, если есть вероятность, что это произойдет, но я почти уверен, что кто-то в конечном итоге сделает это.

Ответы [ 2 ]

16 голосов
/ 29 февраля 2012

Да, это следовало бы за висящей ссылкой.Похоже, вы беспокоитесь о дизайне интерфейса: «Я почти уверен, что кто-то в конечном итоге сделает это».Пожалуйста, не отклоняйте лямбды и std::function на этом основании, поскольку они не более опасны, чем любая другая альтернатива.Лямбды - это просто более простой способ определения локальных функторов.std::function - лучший интерфейс для постоянных, полиморфных функторов, лямбда или нет.

Проблема заключается в том, почему проще захватывать по значению.Пользователь не получит ссылку, если он не напишет &.Конечно, опасность состоит в том, что кто-то привыкнет запускать все свои лямбда-функции с [&], поскольку ссылки «быстрее».Надеюсь, любой такой человек скоро усвоит свой урок ... хотя некоторые счастливые люди просто неисправимы.

12 голосов
/ 29 февраля 2012

То же самое, что происходит, когда вы возвращаете ссылку на локальную переменную: неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...