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 подскажет развёрнутый ответ в реальном времени.