Возврат лямбда-функции в C ++ - PullRequest
0 голосов
/ 07 ноября 2018
typedef int (*identity_t)(int); 
identity_t retFun() { 
  return [](int x) { return x; };
}

Этот фрагмент кода работает, но зачем мне первая строка 100

Почему код ниже не работает?

int (*)(int) retFun() { 
  return [](int x) { return x; };
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Синтаксис C ++, унаследованный от C, странный, нелогичный и архаичный. Вам нужен typefef, чтобы справиться с фактом.

int (*retFun())(int) { ... } 

откровенно нечитаемый беспорядок.

Новый вариант синтаксиса C ++ несколько облегчает проблему.

auto retFun () -> auto (*)(int) -> int { 
   return [](int x) { return x; };
}

Новый синтаксис пишется в основном слева направо, как можно было бы прочитать.

  auto retFun

"retFun is ..."

  () ->

"... функция, которая не принимает аргументов и возвращает ..."

  auto (*)

"... указатель на ..."

  (int) -> 

"... функция, которая принимает аргумент int и возвращает ..."

  int

"... int".

Подробнее о объявлениях функций .

0 голосов
/ 07 ноября 2018

typedef облегчает написание объявления функции, но вам не нужен typedef, если вы знаете правильный синтаксис:

int (*retFun())(int) {
    return [](int x) { return x; };
}

Как видите, typedef не только облегчает написание; это также облегчает чтение.

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