逃避lambdas的示例代码

时间:2011-10-07 18:39:43

标签: c++ lambda c++11

我看了很酷的片段: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2011-C11-Panel-Scott-Meyers-Andrei-Alexandrescu-and-Herb-Sutter
在那里,安德烈(54:00)谈到了逃避兰姆达斯,这些兰姆达引用了当地人。总的来说,我想我已经明白了问题,但我不确定我是否真的得到了它,所以我想通过实例。那有什么简单的例子吗?

1 个答案:

答案 0 :(得分:4)

这是一个简单的例子:

std::function<int()> f() {
    int local;
    return [&]() { return local; }
}

通过引用捕获local变量,然后返回lambda。稍后调用返回的函数将使用引用,该引用现在无效,因此调用未定义的行为。这似乎是编译器发出警告的简单案例。我希望将来我们会看到它。

这是一个更复杂的例子:

std::function<int()> f() {
    int local;
    return g(local);
}

std::function<int()> g(int const& param) {
    return [&]() { return param; }
}

函数g可以在另一个翻译单元中定义,这会损害编译器发出警告的能力。