在C++ 11 lambda表达式中使用超出范围变量

sor*_*h-r 14 c++ lambda std capture c++11

我正在玩C++ 11以获得乐趣.我想知道为什么会这样:

//...
std::vector<P_EndPoint> agents;
P_CommunicationProtocol requestPacket;
//...
bool repeated = std::any_of(agents.begin(), agents.end(),
                    [](P_EndPoint i)->bool 
                    {return requestPacket.identity().id()==i.id();});
Run Code Online (Sandbox Code Playgroud)

编译以此错误终止:

error: 'requestPacket' has not been declared
Run Code Online (Sandbox Code Playgroud)

这是在代码中早先声明的.我试过了::requestPacke,它也没用.

如何在lambda函数中使用外部范围变量?

Tem*_*Rex 34

您需要通过值捕获变量(使用[=]语法)

bool repeated = std::any_of(agents.begin(), agents.end(),
                    [=](P_EndPoint i)->bool                          
                    {return requestPacket.identity().id()==i.id();});
Run Code Online (Sandbox Code Playgroud)

或通过引用(使用[&]语法)

bool repeated = std::any_of(agents.begin(), agents.end(),
                    [&](P_EndPoint i)->bool 
                    {return requestPacket.identity().id()==i.id();});
Run Code Online (Sandbox Code Playgroud)

请注意,正如@aschepler指出的那样,没有捕获具有静态存储持续时间的全局变量,只捕获功能级变量:

#include <iostream>

auto const global = 0;

int main()
{
    auto const local = 0;

    auto lam1 = [](){ return global; }; // global is always seen
    auto lam2 = [&](){ return local; }; // need to capture local

    std::cout << lam1() << "\n";
    std::cout << lam2() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

  • Lambdas从不捕获全局变量,只捕获函数局部变量. (5认同)