Что означает [=] в 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?


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

Я согласен с @underscore_d - похоже, какой-то клик повышает рейтинг, верно? :)
BitTickler

Ответы:


108

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

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


13
«Это необходимо» - эта опция не обязательна; мы могли бы также написать [&], [=offset, =input]и т.д.
MM

1
@MM - Разве это не ссылки на местных жителей?
Бесполезный

5
@MM Использование захвата ссылки здесь было бы проблемой, потому что время жизни этих локальных переменных закончится, как только будет возвращена лямбда. Вы правы, что мы можем перечислить отдельные переменные по отдельности.
templatetypedef

46

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


3
Вы также можете использовать, []который ничего не захватывает. :)
Daniel Kamil Kozar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.