Що означає [=] у C ++?


93

Я хочу знати, що [=]робить? Ось короткий приклад

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

45

Це список лямбда- захоплення. Робить змінні доступними для лямбда-сигналу. Ви можете використовувати, [=]які копії за значенням, або [&]які передаються за посиланням.


3
Ви також можете використовувати те, []що нічого не фіксує. :)
Даніель Каміль Козар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.