你可以在类的初始化列表中使用Lambda吗?

13

我正在尝试使用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表达式。

我能使用吗?如果可以,那么正确的语法是什么?

3个回答

27

你正在试图将一个 lambda 转换为 int - 你应该调用该 lambda :

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

7

你的变量被声明为int

你想要调用lambda吗?这个应该可以工作:

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

您是想要一个类型为std::function<>的变量吗?


是的,我正在尝试通过从 lambda 返回值来填充 n_ - John Dibling
1
@John 看到更新了。我也确实看到在更复杂(多语句)的 lambda 中,这可能会很有用。 - Konrad Rudolph
没错。在我的实际使用情况中,我正在以字节为单位存储只读文件的大小。 - John Dibling

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接