10

C ++11Lambdaを使用しconstてクラスのメンバー変数を初期化しようとしています。

非常に単純化された例:

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

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

int main()
{
    Foo f;
}

MSVC10では、これにより次の結果が得られます。

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

IDEONEでは、これにより次の結果が得られます。

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

クラスの初期化リストでラムダを使用できないという考えを持ち始めています。

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

4

3 に答える 3

24

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

Foo::Foo()
:   n_( []() -> int { return 42; }() ) //note the () to call the lambda!
{
}
于 2012-06-14T16:45:51.130 に答える
7

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

ラムダを呼び出しますか?これは機能するはずです:

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

または、型の変数が必要でしたstd::function<>か?

于 2012-06-14T16:45:15.120 に答える
2

ラムダを作成しています。このようにコンパイラーが述べているように、ラムダ自体をn_に格納しようとしています。

于 2012-06-14T16:46:00.110 に答える