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

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

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

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

13

Решение

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

[…] а уникальный, безымянный несоюзный тип класса […]

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

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

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

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

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

19

Другие решения

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

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

10