2012-06-14 42 views
9

我正在尝试使用C++ 11 Lambda来初始化类的const成员变量。您可以在类的初始化列表中使用Lambda吗?

一个更简单的例子:

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' 

我开始明白我的意思,我不能在类的初始化列表中使用lambdas。

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

回答

22

你正试图从一个lambda转换为int - 你应该调用拉姆达代替:

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

您的变量声明为int

你想调用拉姆达?这应该工作:

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

还是你想std::function<>类型的变量?

+0

+1:是的,我试图通过从lambda返回值来填充'n_'。 –

+1

@John查看更新。我实际上看到了如何用更复杂的(多语句)lambda来实现它。确切地说, –

+0

。在我的实际使用情况中,我以字节存储只读文件的大小。 –

2

你正在创建一个lambda,这样的编译器的状态,你想存储拉姆达本身在n_。

相关问题