2013-06-04 46 views
7

Tôi đang chơi với C++ 11 để giải trí. Tôi đang tự hỏi tại sao điều này xảy ra:sử dụng các biến phạm vi trong biểu thức lambda 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();}); 

Compilation chấm dứt với lỗi này:

error: 'requestPacket' has not been declared 

Đó là tuyên bố trước đó trong mã. Tôi đã thử ::requestPacke và nó cũng không hoạt động.

Làm cách nào để sử dụng biến phạm vi bên ngoài bên trong hàm lambda?

+0

Chúng nằm trong bên một phương thức của một lớp. Đó không phải là một danh hiệu tốt, có lẽ tôi nên thay đổi nó thành 'ngoài phạm vi hiện tại' ... –

Trả lời

24

Bạn cần phải capture the variable, hoặc bằng giá trị (bằng cách sử dụng cú pháp [=])

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

hoặc bằng cách tham khảo (bằng cách sử dụng cú pháp [&])

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

Lưu ý rằng khi @aschepler chỉ ra, global variables with static storage duration are not captured , chỉ các biến cấp chức năng:

#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 không bao giờ chụp hình cầu, chỉ có các biến chức năng cục bộ. – aschepler

+1

Tnx, đã cập nhật câu trả lời. – TemplateRex