Подтвердить что ты не робот

Возврат лямбда без std:: function

Рассмотрим следующую функцию, возвращающую лямбда:

std::function<int()> make_counter()
{
    int i = 0;
    return [=]() mutable { return i++; };
}

Можно ли вернуть фактический лямбда-тип, не обернув его в std::function?

4b9b3361

Ответ 1

С++ 11: Нет. Каждое выражение лямбда имеет, я цитирую (§5.1.2/3):

[...] a уникальный, неназванный тип неединичного класса [...]

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

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

Как отметил @Luc в Lounge, если вы захотите заменить свой make_counter (и если он не является шаблоном или не перегружен или что-то еще), будет работать следующее:

auto const make_counter = [](int i = 0) {
  return [i]() mutable { return i++; };
};

С++ 1y: Да, через вывод возвращаемого типа для нормальных функций (N3582).

Ответ 2

Если вы обманываете и используете возврат типа возврата, да, вы можете (ссылку).

Обратите внимание, что это возможно только за пределами С++ 11, хотя это может быть выполнено в обычном, не вызывающем предупреждения С++ 11, используя lambdas (то есть лямбда внутри лямбды, которая возвращает эту lamba).