funciones examples example array c++ c++11 lambda return-type higher-order-functions

c++ - examples - devolviendo una lambda sin std:: función



std::function c++ (2)

C ++ 11: No. Todas las expresiones lambda tienen, cito (§5.1.2 / 3):

[...] un tipo de clase único , sin nombre y sin unión [...]

Esto significa efectivamente que no se puede saber el tipo de lambda sin conocer primero la expresión correspondiente.

Ahora, si no capturó nada, podría usar la conversión al puntero de la función y devolverlo (un tipo de puntero a la función), pero eso es bastante limitante.

Como señaló @Luc en el Lounge, si está dispuesto a reemplazar su make_counter (y si no es una plantilla, o está sobrecargado, o algo así), funcionaría lo siguiente:

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

C ++ 1y: Sí, mediante la deducción del tipo de devolución para las funciones normales ( N3582 ).

Considere la siguiente función que devuelve un lambda:

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

¿Es posible devolver el tipo de lambda real sin envolverlo en una std::function ?


Si haces trampa y usas la deducción del tipo de devolución, sí puedes (vincular) .

Tenga en cuenta que esto solo es posible más allá de C ++ 11, aunque se puede lograr en C ++ 11 habitual que no advierta de las advertencias utilizando lambdas (es decir, una lambda dentro de una lambda que devuelve ese lamba).