Как передать локальную переменную и аргумент с тем же именем (используя это ключевое слово) внутри лямбда-функций в C ++? - PullRequest
1 голос
/ 08 октября 2019
#include <iostream>
#include <functional>
int main(){
    int a = 10; 
    std::function<int(int)> functionPointer = [a](int a)-> int{ return a + a + 100 ; };
    int returnValue = functionPointer(50);
    std::cout<<returnValue<<endl;
}

Я ожидал 10 + 50 + 100 = 160, но на выходе получилось 10 + 10 + 100 = 120. Могу ли я внести какие-либо изменения, чтобы получить 160, сохраняя имена переменных такими, как они есть?

Ответы [ 2 ]

10 голосов
/ 08 октября 2019

На самом деле существует способ решить эту проблему, не меняя имя переменной или параметра, используя псевдоним захвата:

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().

0 голосов
/ 08 октября 2019

Я считаю, что нет способа сделать именно то, что вы хотели бы, так как компилятор не может иметь одну переменную a с двумя разными значениями.

...