Mediumlambda
В чём разница между захватом по значению и по ссылке в лямбде?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Захват по значению [=]/[x]: копия хранится в замыкании, безопасна после выхода переменной из scope, но требует копируемости. Захват по ссылке [&]/[&x]: хранится ссылка, без накладных, но dangling, если лямбда вызывается после уничтожения переменной.
std::vector<int> data = load();
// По значению — безопасно, но копия (дорого для больших):
auto safe = [data]() { return data.size(); };
// По ссылке — быстро, но data должна жить дольше лямбды:
auto fast = [&data]() { return data.size(); };
// C++14: init-capture (включая move-only типы):
auto p = [ptr = std::move(smartPtr)]() { ptr->doStuff(); };По ссылке часто быстрее для больших объектов, но небезопасно в асинхронных сценариях (callback, который вызовется позже).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.