Список захвата в лямбда-функциях: есть ли смысл захватывать все переменные?
1,00
р.
р.
Внутри квадратных скобок в определении лямбда-функции можно задать переменные из внешнего контекста, которые нужны для работы этой лямбда функции. Можно их перечислить вручную, а можно просто задать захват всех переменных сразу: auto lambda1 = [x](int a) {return a < x } // Список захвата задан вручную auto lambda2 = [&](int a) {return a < x } // Тупо захватываем всё по ссылке Собственно вопрос: при каких условиях какой вариант предпочтителен? Есть ли вообще смысл заморачиваться и указывать список захвата вручную, может быть проще всегда писать [&] и не напрягать мозг, компилятор всё и так оптимизирует?
Ответ Захватывать, следуя Мейерсу, по умолчанию вообще не стоит: по ссылке - чревато висячими ссылками, по значению - висячими указателями (особенно в плане this). Т.е. всегда используйте захват только того, что вам нужно, и так, как того требует код (что именно вы хотите достичь своей лямбдой).