C++11 返回lambda捕获函数参数引用 #包括 #包括 使用名称空间std; std::函数makeLambda(int-param) { return[¶m](){cout

C++11 返回lambda捕获函数参数引用 #包括 #包括 使用名称空间std; std::函数makeLambda(int-param) { return[¶m](){cout,c++11,lambda,C++11,Lambda,正如您所注意到的,这是未定义的行为。任何情况都可能发生,包括看起来正常工作。如果您切换编译器、更改标志、忘记洗碗或一小时后起床,您可能会得到完全不同的结果 例如,某些版本和标志集的Clang。我看到它总是可以打印5。这只是未定义行为的众多功能之一?我没有机会使用其他编译器。也许我可以试试。谢谢。Clang显示另一个不可预测的输出。因此它符合预期。 #include <iostream> #include <functional> using namespace std;

正如您所注意到的,这是未定义的行为。任何情况都可能发生,包括看起来正常工作。如果您切换编译器、更改标志、忘记洗碗或一小时后起床,您可能会得到完全不同的结果


例如,某些版本和标志集的Clang。

我看到它总是可以打印5。这只是未定义行为的众多功能之一?我没有机会使用其他编译器。也许我可以试试。谢谢。Clang显示另一个不可预测的输出。因此它符合预期。
#include <iostream>
#include <functional>

using namespace std;

std::function<void(void)> makeLambda(int param)
{
    return [&param](){cout << param << endl;};
}

int main()
{
    auto callback = makeLambda(5);
    callback();
}