2012-06-14 19 views
9

Próbuję użyć Lambda C++ 11, aby zainicjować zmienną składową const klasy.Czy można użyć listy inicjalizacji klasy Lambda w klasie?

Znacznie uproszczony przykład:

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

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

int main() 
{ 
    Foo f; 
} 

W MSVC10 Daje:

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

W IDEONE Daje:

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

Zaczynam się pomysł, że ja nie może używać lambd na liście inicjalizacji klasy.

Czy mogę? Jeśli tak, to jaka jest właściwa składnia?

Odpowiedz

22

próbujesz konwertować z lambda do int - należy zadzwonić lambda zamiast:

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

Twoja zmienna jest zadeklarowana jako int.

Czy chcesz wywołać lambda? To powinno działać:

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

Albo chciałeś zmienną typu std::function<>?

+0

+1: Tak, próbuję wypełnić 'n_', zwracając wartość z lambda. –

+1

@John Zobacz aktualizację. I rzeczywiście widzę, jak to może być przydatne w przypadku bardziej złożonego (wielokrotnego wyrażania) lambda. –

+0

Dokładnie. W moim przypadku użycia przechowuję rozmiar pliku tylko do odczytu w bajtach. –

2

Tworzysz lambda, w ten sposób jako stany kompilatora, który próbujesz zapisać lambda się w n_.

Powiązane problemy