Почему моя лямбда-функция не выполняется? - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть следующая функция, и она вызывается main. Но я не вижу, чтобы выполнялась лямбда-функция.

int LambdaTest(int x, int y, bool bLambda) {
 cout << "Lambda Rxd : " << bLambda << endl;
 if (bLambda) {
  return x + y;
 } else {
  return ((x > y) ? (x - y) : (y - x));
 }
}

int main() {
 int x = 10, y = 30;
 int val = -1;

 val = LambdaTest(x, y, [](int x) -> bool {
  return x > 15;
 });
 cout << "Lambda test 1: " << val << endl;

 val = LambdaTest(x, y, [](int y) -> bool {
  return y > 15;
 });
 cout << "Lambda test 2: " << val << endl;

 return 0;
}

В этой основной функции я ожидаю, что лямбда-функция, которая передается в качестве третьего параметра вызова функции, должна выполнить и вернуть true или false.

Но я не вижу правильного значения, передаваемого в тело функции.

Есть ли необходимость сделать что-то еще?

1 Ответ

0 голосов
/ 02 ноября 2019

У вас есть лямбда без сохранения состояния.

Лямбда без сохранения состояния может быть преобразована в указатель на функцию. Таким образом, ваши лямбды конвертируются в void (*)(int), и этот указатель присваивается bool, что дает всегда true.

Чтобы вызывать лямбду "на лету", вам нужно добавить () с параметром:

 val = LambdaTest(x, y, [](int x) -> bool {
  return x > 15;
 }(x) ); // <---
 cout << "Lambda test 1: " << val << endl;

 val = LambdaTest(x, y, [](int y) -> bool {
  return y > 15;
 }(y) ); // <---


[](){} -> bool ( /*here passed arguments */ );

Другое решение - сохранить функтор, сгенерированный лямбда-выражением, в некоторой переменной, а затем применить () к этому объекту:

 auto l1 = [](int x) -> bool {
  return x > 15;
 };

 val = LambdaTest(x, y, l1(x));
 cout << "Lambda test 1: " << val << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...