На самом деле существует способ решить эту проблему, не меняя имя переменной или параметра, используя псевдоним захвата:
std::function<int(int)> functionPointer = [b=a](int a)-> int{ return a + b + 100 ; };
Как объясняется здесь , поскольку C ++ 14 лямбдаЗахват является обобщенным, который включает переименование переменных лямбда-объекта. Хотя при захвате [a]
локальная переменная a
будет скопирована из внешней области видимости в переменную объекта лямбда-выражения a
, эту переменную объекта-лямбда также можно назвать с синтаксисом [b=a]
, поэтому копия лямбда-выражения известна как b
,Мы также можем определять переменные лямбда-объекта с помощью выражений, например [a=5*a]
или [b=5*a]
, что иногда является удобным способом, например, передачи членов структуры или результатов методов доступа в лямбду.
Это позволяетсделать вещи, которые ранее были невозможны, а именно, передать unique_ptr
объекту лямбда (т.е. передать право собственности!) с помощью std::move()
.