C++ Conversión a puntero de función.


Ejemplo

Si la lista de capturas de una lambda está vacía, entonces la lambda tiene una conversión implícita a un puntero de función que toma los mismos argumentos y devuelve el mismo tipo de retorno:

auto sorter = [](int lhs, int rhs) -> bool {return lhs < rhs;};

using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter; // implicit conversion

Dicha conversión también se puede hacer cumplir con el operador unario plus:

func_ptr sorter_func2 = +sorter; // enforce implicit conversion

Llamar a este puntero de función se comporta exactamente como invocar operator() en la lambda. Este puntero de función no depende en modo alguno de la existencia del cierre lambda de origen. Por lo tanto, puede sobrevivir el cierre lambda.

Esta característica es principalmente útil para usar lambdas con API que tratan con punteros de función, en lugar de objetos de función C ++.

C ++ 14

La conversión a un puntero de función también es posible para las lambdas genéricas con una lista de captura vacía. Si es necesario, la deducción de argumentos de la plantilla se utilizará para seleccionar la especialización correcta.

auto sorter = [](auto lhs, auto rhs) { return lhs < rhs; };
using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter;  // deduces int, int
// note however that the following is ambiguous
// func_ptr sorter_func2 = +sorter;