2012-06-14 18 views
9

クラスのメンバー変数constを初期化するためにC++ 11ラムダを使用しようとしています。クラスの初期化リストでラムダを使用できますか?

くらいの簡単な例:MSVC10で

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

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

int main() 
{ 
    Foo f; 
} 

この利回り:IDEONE

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

この利回り:

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

私はアイデアを得るために始めていますクラスの初期化リストでlambdaを使用することはできません。

できますか?もしそうなら、適切な構文は何ですか?

答えて

22

あなたはintにラムダから変換しようとしている - あなたの代わりにラムダを呼び出す必要があります:

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

変数はintと宣言されています。

を呼び出しますか?ラムダ?これはうまくいくはずです:

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

またはstd::function<>の変数を使用しましたか?

+0

+1:はい、私はラムダから値を返すことによって 'n_'を設定しようとしています。 –

+1

@John更新を参照してください。そして、実際にはもっと複雑な(複数のステートメント)ラムダでどのように役立つのか分かります。 –

+0

正確です。実際の使用例では、読み取り専用ファイルのサイズをバイト単位で保存しています。 –

2

あなたは、コンパイラの状態として、このようにラムダを作成している、あなたは、ラムダを保存しようとしていますそれ自体はn_です。

関連する問題