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