Что означает [&] перед функцией?
Что означает следующая строка кода?
auto allowed = [&](int x, const std::vector<int>&vect){
....
}
Я имею в виду, что делает [&]
? и работает ли она с тем же именем переменной?
Поскольку он используется таким образом: unsigned short ok = get_allowed(0, vect);
Ответы
Ответ 1
Это означает, что лямбда-функция будет захватывать все переменные в области с помощью справки.
Чтобы использовать другие переменные, отличные от того, что было передано лямбда внутри него, мы можем использовать capture-clause []
.
Вы можете захватывать как ссылку, так и значение, которое вы можете указать с помощью и и = соответственно:
-
[=]
захватить все переменные в области по значению
-
[&]
захватывать все переменные в пределах области по ссылке
-
[&var]
захватить var
по ссылке
-
[&, var]
укажите, что значение по умолчанию
способ захвата - по ссылке, и мы хотим захватить var
-
[=, &var]
захватить переменные в области по значению по умолчанию, но захватить var
с помощью ссылки
вместо
Ответ 2
Это список захвата лямбда и был определен в С++ из стандарта С++ 11.
[&]
Это означает, что вы хотите получить доступ к каждой переменной по ссылке, находящейся в настоящее время в области видимости в лямбда-функции.
Это ваша работа, чтобы гарантировать, что упомянутые объекты все еще находятся в области видимости в момент, когда замыкание вызывается, иначе поведение программы undefined.
Ответ 3
Определяет выражение Lambda, которое в основном является функцией без имени. Он имеет список параметров (int x, const std::vector<int>&vect)
и тело функции { ... }
. Но он также имеет список захвата в начале [&]
. Если вы хотите получить доступ к переменной (которая не является параметром) из тела выражения лямбда, вы должны сделать выражение "взять переменную с собой", чтобы эту переменную можно было использовать позже, когда выражение лямбда будет казнены.
Вы можете либо предоставить список переменных, либо использовать "все", чтобы захватить все из них. [&]
означает захват всех из них по ссылке, а [=]
означает захват всех из них по значению.
(Если вы используете [&]
, обратите внимание, что тело лямбда будет использовать значение переменной во время выполнения лямбда, а не значение, которое было бы действительным при создании лямбда! Это потому, что вы не иметь копию значения, только ссылку на него.)