15

私は楽しみのために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();});

コンパイルは次のエラーで終了します。

error: 'requestPacket' has not been declared

これは、コードで以前に宣言されています。私も試し::requestPackeてみましたが、うまくいきません。

ラムダ関数内で外部スコープ変数を使用するにはどうすればよいですか?

4

1 に答える 1

38

値によって (構文を使用して)変数をキャプチャする必要があります。[=]

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

または参照による ([&]構文を使用)

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

@ashepler が指摘しているように、静的ストレージ期間を持つグローバル変数はキャプチャされず、関数レベルの変数のみがキャプチャされることに注意してください。

#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";
}
于 2013-06-04T12:50:48.580 に答える