2012-06-14 8 views
9

Estoy tratando de usar un C++ 11 Lambda para inicializar una variable miembro const de una clase.¿Se puede usar una lista de inicialización de Lambda In A Class?

Un gran ejemplo simplificado:

class Foo 
{ 
public: 
    const int n_; 
    Foo(); 
}; 

Foo::Foo() 
: n_([]() -> int { return 42; }) 
{ 
} 

int main() 
{ 
    Foo f; 
} 

En esta MSVC10 rendimientos:

error C2440: 'initializing' : cannot convert from '`anonymous-namespace'::<lambda0>' to 'const int' 

En esta IDEONE rendimientos:

prog.cpp: In constructor 'Foo::Foo()': 
prog.cpp:9:34: error: invalid conversion from 'int (*)()' to 'int' 

estoy empezando a tener la idea de que yo no se puede usar lambdas en la lista de inicialización de una clase.

¿Lo puedo? Si es así, ¿cuál es la sintaxis correcta?

Respuesta

22

usted está tratando de convertir de un lambda a int - debe llamar a la lambda en su lugar:

Foo::Foo() 
: n_([]() -> int { return 42; }()) //note the() to call the lambda! 
{ 
} 
7

Su variable se declara como int.

¿Quieres invocar la lambda? Esto debería funcionar:

n_(([]() -> int { return 42; })()) 

O es que quieren una variable de tipo std::function<>?

+0

+1: Sí, estoy tratando de poblar 'n_' devolviendo el valor de la lambda. –

+1

@John Ver la actualización. Y realmente veo cómo eso puede ser útil con una lambda más compleja (multi declaraciones). –

+0

Exactamente. En mi caso de uso real, estoy almacenando el tamaño de un archivo de solo lectura en bytes. –

2

Estás creando un lambda, así como los estados del compilador, que está tratando de almacenar el lambda en sí mismo en n_.

Cuestiones relacionadas