10

我正在尝试使用 C++11 Lambda 来初始化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'

我开始意识到我不能在类的初始化列表中使用 lambda。

我可以吗?如果是这样,正确的语法是什么?

4

3 回答 3

24

您正在尝试从 lambda 转换为 int - 您应该改为调用 lambda:

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

您的变量声明为int.

你想调用lambda 吗?这应该有效:

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

或者你想要一个类型的变量std::function<>

于 2012-06-14T16:45:15.120 回答
2

您正在创建一个 lambda,正如编译器所述,您正在尝试将 lambda 本身存储在 n_ 中。

于 2012-06-14T16:46:00.110 回答