2012-06-14 13 views
9

Ich versuche, ein C++ 11 Lambda zu verwenden, um eine const Mitgliedsvariable einer Klasse zu initialisieren.Können Sie ein Lambda in der Initialisierungsliste einer Klasse verwenden?

Ein wesentlich vereinfachtes Beispiel:

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

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

int main() 
{ 
    Foo f; 
} 

In MSVC10 ergibt dies:

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

In IDEONE Daraus ergibt sich:

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

Ich fange an, die Idee zu bekommen, dass ich kann Lambda in der Initialisierungsliste einer Klasse nicht verwenden.

Kann ich? Wenn ja, wie lautet die richtige Syntax?

Antwort

22

Sie von einem Lambda zu konvertieren versuchen, int - Sie sollten die Lambda stattdessen nennen:

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

Ihre Variable wird als int deklariert.

Möchten Sie aufrufen der Lambda? Dies sollte funktionieren:

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

Oder haben Sie eine Variable vom Typ std::function<>?

+0

+1: Ja, ich versuche 'n_' zu füllen, indem ich den Wert von Lambda zurückgebe. –

+1

@John Siehe Aktualisierung. Und ich sehe tatsächlich, wie das mit einem komplexeren Lambda (Multi-Statement) nützlich sein kann. –

+0

Genau. In meinem tatsächlichen Anwendungsfall speichere ich die Größe einer schreibgeschützten Datei in Bytes. –

2

Sie erstellen einen Lambda, auf diese Weise als Compiler Staaten, versucht man, den Lambda zu speichern selbst in n_.

Verwandte Themen