Привязка константной функции к лямбде - PullRequest
17 голосов
/ 01 июля 2019

Этот код

int(&foo)(int, int) = [](int a, int b) { return a + b; };

не компилируется, поскольку очевидно, что неконстантная ссылка не может быть инициализирована с помощью временной.Куда мне положить const?

Ответы [ 2 ]

24 голосов
/ 01 июля 2019

Как уже упоминалось, лямбда без захвата может быть преобразована в указатель на функцию.Поэтому, если вы хотите связать эту статическую функцию со ссылкой, вам нужно разыменовать указатель.

int(&foo)(int, int) = *[](int a, int b) { return a + b; };

Применение * к лямбде приводит к запуску множества механизмов. Поскольку лямбда неt перегрузить operator*, но осуществляет преобразование в тип указателя, это преобразование происходит.После этого * применяется к возвращенному указателю, и это дает функцию lvalue.Это значение может затем привязаться к ссылке.

Вот оно live .

11 голосов
/ 01 июля 2019

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

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

[Lambda Functions][1]

Я изменил ваш код, как показано ниже, и он работал.

int (*foo)(int, int)= [] (int a, int b) { return a + b; };
int main()
{
   cout << "Res:: " << foo(10,20);
   return 0;
}

Я просто делаю это указателем на функцию.

С другой стороны,

auto foo = [](int a, int b) { return a + b; }; 

также хороший выбор.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...