2011-01-31 18 views
26

Para el siguiente código:C++ 11 lambda en decltype

auto F(int count) -> decltype([](int m) { return 0; }) 
{                
    return [](int m) { return 0; };         
} 

g ++ 4.5 da los errores:

test1.cpp:1:32: error: expected primary-expression before 'int' 
test1.cpp:1:32: error: expected ')' before 'int' 

¿Cuál es el problema? ¿Cuál es la forma correcta de devolver una lambda desde una función?

Respuesta

39

No se puede usar una expresión lambda, excepto creando realmente ese objeto, lo que hace que sea imposible pasar al tipo de deducción como decltype.

Irónicamente, por supuesto, las reglas de retorno lambda lo hacen para que pueda devolver lambdas de lambdas, ya que hay algunas situaciones en las que no es necesario especificar el tipo de retorno.

Solo tiene dos opciones: devolver un contenedor polimórfico como std::function, o hacer que F sea una lambda real.

auto F = [](int count) { return [](int m) { return 0; }; }; 
+0

+1 para respuesta completa –

+3

1 para aclarar el problema. Revisé el borrador SC22-N-4411 y encontré un poco aterrador la frase que dice que "cada expresión lambda tiene un tipo único". – 6502

+3

@ 6502: Sí, ese hecho me hizo darme cuenta de por qué el tamaño de mi ejecutable aumentó repentinamente un 10% debido a 'stable_sort'. – Mehrdad

9

algo como esto se adapte a sus necesidades?

#include <functional> 

std::function<int(int)> F(int count) 
{                
    return [](int m) { return 0; };         
} 
3

Con C++ 14, esto es ahora posible:

auto F(int count) 
{ 
    return [](int m) { return 0; }; 
} 
Cuestiones relacionadas