Что означает [=] в C ++?

94

Я хочу знать, что [=]делает? Вот небольшой пример

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

Как будет работать код []вместо [=]?

Я предполагаю что

std::function<T (T)>

означает прототип функции, которая становится (T)аргументом и типом возвращаемого значения T?

der_lord
источник
4
Это странно высоко оценено за то, что, кажется, задает 3 разных неизученных вопроса и является дубликатом того, что такое лямбда-выражение в C ++ 11?
underscore_d
Я согласен с @underscore_d - похоже, какой-то клик повышает рейтинг, верно? :)
BitTickler

Ответы:

108

[=]Вы имеете в виду является частью списка захвата для лямбда - выражения. Это сообщает C ++, что код внутри лямбда-выражения инициализируется, так что лямбда-функция получает копию всех локальных переменных, которые она использует при создании. Это необходимо для того, чтобы лямбда-выражение могло ссылаться на factorи offset, которые являются локальными переменными внутри функции.

Если вы замените [=]с [], вы получите ошибку компиляции , потому что код внутри лямбда - выражения не будут знать , что переменные offsetи factorссылаться. Многие компиляторы выдают хорошие диагностические сообщения об ошибках, если вы это делаете, поэтому попробуйте и посмотрите, что произойдет!

templatetypedef
источник
13
«Это необходимо» - эта опция не обязательна; мы могли бы также написать [&], [=offset, =input]и т.д.
MM
1
@MM - Разве это не ссылки на местных жителей?
Бесполезный
5
@MM Использование захвата ссылки здесь было бы проблемой, потому что время жизни этих локальных переменных закончится, как только будет возвращена лямбда. Вы правы, что мы можем перечислить отдельные переменные по отдельности.
templatetypedef
46

Это список захвата лямбда . Делает переменные доступными для лямбды. Вы можете использовать, [=]какие копии копируются по значению или [&]какие передаются по ссылке.

кометен
источник
3
Вы также можете использовать, []который ничего не захватывает. :)
Daniel Kamil Kozar