2013-06-04 14 views
7

私は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();}); 

コンパイルは、このエラーで終了:

以前のコード内で宣言されて
error: 'requestPacket' has not been declared 

。私は::requestPackeを試しましたが、うまくいきません。

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

+0

クラスのメソッドの側面。それは良いタイトルではない、たぶん私はそれを '現在のスコープの外に '変更する必要があります... –

答えて

24

あなたは

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();}); 

または参照によって([=]構文を使用)のいずれかの値により、capture the variableに必要@ascheplerが指摘するようにすることを注意、global variables with static storage duration are not captured 、機能レベルの変数のみ:

#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"; 
} 
+3

Lambdasはグローバルをキャプチャすることはなく、関数ローカル変数のみをキャプチャします。 – aschepler

+1

Tnx、答えを更新しました。 – TemplateRex

関連する問題