Подтвердить что ты не робот

Что означает [&] перед функцией?

Что означает следующая строка кода?

auto allowed = [&](int x, const std::vector<int>&vect){

....

}

Я имею в виду, что делает [&]? и работает ли она с тем же именем переменной?

Поскольку он используется таким образом: unsigned short ok = get_allowed(0, vect);

4b9b3361

Ответ 1

Это означает, что лямбда-функция будет захватывать все переменные в области с помощью справки.

Чтобы использовать другие переменные, отличные от того, что было передано лямбда внутри него, мы можем использовать capture-clause []. Вы можете захватывать как ссылку, так и значение, которое вы можете указать с помощью и и = соответственно:

  • [=] захватить все переменные в области по значению
  • [&] захватывать все переменные в пределах области по ссылке
  • [&var] захватить var по ссылке
  • [&, var] укажите, что значение по умолчанию способ захвата - по ссылке, и мы хотим захватить var
  • [=, &var] захватить переменные в области по значению по умолчанию, но захватить var с помощью ссылки вместо

Ответ 2

Это список захвата лямбда и был определен в С++ из стандарта С++ 11.

[&] Это означает, что вы хотите получить доступ к каждой переменной по ссылке, находящейся в настоящее время в области видимости в лямбда-функции.

Это ваша работа, чтобы гарантировать, что упомянутые объекты все еще находятся в области видимости в момент, когда замыкание вызывается, иначе поведение программы undefined.

Ответ 3

Определяет выражение Lambda, которое в основном является функцией без имени. Он имеет список параметров (int x, const std::vector<int>&vect) и тело функции { ... }. Но он также имеет список захвата в начале [&]. Если вы хотите получить доступ к переменной (которая не является параметром) из тела выражения лямбда, вы должны сделать выражение "взять переменную с собой", чтобы эту переменную можно было использовать позже, когда выражение лямбда будет казнены.

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

(Если вы используете [&], обратите внимание, что тело лямбда будет использовать значение переменной во время выполнения лямбда, а не значение, которое было бы действительным при создании лямбда! Это потому, что вы не иметь копию значения, только ссылку на него.)