2012-06-14 10 views
9

Sto cercando di utilizzare un C++ 11 Lambda per inizializzare una variabile membro const di una classe.È possibile utilizzare un elenco di inizializzazione di una Lambda in una classe?

Un gran esempio semplificato:

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

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

int main() 
{ 
    Foo f; 
} 

In questo MSVC10 rendimenti:

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

In questo IDEONE rendimenti:

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

sto iniziando a ottenere l'idea che ho non è possibile utilizzare lambda in un elenco di inizializzazione di classe.

Posso? In tal caso, qual è la sintassi corretta?

risposta

22

si sta tentando di convertire da un lambda a int - si dovrebbe chiamare il lambda invece:

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

La variabile è dichiarata come int.

Vuoi invocare il lambda? Questo dovrebbe funzionare:

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

O volevi una variabile di tipo std::function<>?

+0

+1: Sì, sto cercando di popolare 'n_' restituendo il valore dal lambda. –

+1

@John Vedi aggiornamento. E in realtà vedo come ciò possa essere utile con un lambda più complesso (multi-statement). –

+0

Esattamente. Nel mio caso di utilizzo effettivo, sto memorizzando la dimensione di un file di sola lettura in byte. –

2

si sta creando un lambda, in questo modo, come gli stati del compilatore, si sta cercando di memorizzare il lambda stesso in n_.

Problemi correlati