c++ - Vincular una referencia de función const a un lambda
c++11 (2)
Este codigo
int(&foo)(int, int) = [](int a, int b) { return a + b; };
no compila ya que aparentemente una referencia no constante no se puede inicializar con un temporal.
¿Dónde pongo la
const
?
Como ya se mencionó, un lambda sin captura se puede convertir en un puntero de función. Por lo tanto, si desea vincular esa función estática a una referencia, debe desreferir el puntero.
int(&foo)(int, int) = *[](int a, int b) { return a + b; };
La aplicación de
*
a la lambda provoca la activación de un montón de maquinaria. Dado que lambda no sobrecarga al
operator*
, pero implementa una conversión a un tipo de puntero, esa conversión se produce.
Luego se aplica
*
al puntero devuelto y eso produce una función lvalue.
Ese valor puede entonces vincularse a la referencia.
Aquí está en live .
Un lambda solo se puede convertir en un puntero de función si no se captura.
El tipo de cierre para una expresión lambda sin captura lambda tiene una función de conversión const no explícita no virtual pública a puntero a función que tiene los mismos parámetros y tipos de retorno que el operador de llamada a función del tipo de cierre. El valor devuelto por esta función de conversión será la dirección de una función que, cuando se invoca, tiene el mismo efecto que invocar al operador de llamada a función del tipo de cierre
[Lambda Functions][1]
Cambié su código como abajo y funcionó.
int (*foo)(int, int)= [] (int a, int b) { return a + b; };
int main()
{
cout << "Res:: " << foo(10,20);
return 0;
}
Sólo lo hago puntero de función.
Alternativamente,
auto foo = [](int a, int b) { return a + b; };
También es una buena opción.
¡Espero que ayude!