c++ - una - no se puede convertir expresion lambda en el tipo delegado
Especificando una función lambda como argumento predeterminado (2)
¿Cómo asigno un lambda como argumento predeterminado? Me gustaría hacer esto:
int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })
{
return f(i);
}
pero mi compilador (g ++ 4.6 en Mac OS X) se queja:
error: local variable ''x'' may not appear in this context
EDITAR : De hecho, esto fue un error del compilador. El código anterior funciona bien con una versión reciente de gcc (4.7-20120225).
Esto parece ser un error en gcc; el estándar permite expresiones lambda en parámetros por defecto siempre que no se capture nada.
Lo siguiente parece ser todo lo que el FDIS dice sobre lambdas en los parámetros por defecto, por lo que cualquier uso que no esté prohibido aquí debería permitirse por defecto.
C ++ 11 FDIS 5.1.2 / 13
Una expresión lambda que aparece en un argumento predeterminado no capturará implícita o explícitamente ninguna entidad.
[Ejemplo:
void f2() { int i = 1; void g1(int = ([i]{ return i; })()); // ill-formed void g2(int = ([i]{ return 0; })()); // ill-formed void g3(int = ([=]{ return i; })()); // ill-formed void g4(int = ([=]{ return 0; })()); // OK void g5(int = ([]{ return sizeof i; })()); // OK }
- ejemplo final]
Podría usar la sobrecarga:
int foo(int i)
{
return foo(i, [](int x) -> int { return x / 2; });
}
int foo(int i, std::function<int(int)> f)
{
return f(i);
}