2012-03-31 23 views
12

tôi đã biên soạn sử dụng Visual Studio 2010 biên dịch này và nó có vấn đề về lỗi biên dịch trên lambda lồng nhau chụp các biến bị bắt đã được cấp có lambda đầu tiên:Nested Lambda chụp vấn đề

Functor& fn, const WorkData& workData 

    group.run([&fn, workData](){ 
    async_future<ProcessorResult> future([&fn, workData]() -> ProcessorResult{ 
    ProcessorResult result = fn.Process(workData); 

    return result; 
    }); 
}); 

tôi nhận được:

**error C3480**: '`anonymous-namespace'::<lambda3>::fn': a lambda capture variable must be from an enclosing function scope 

Dường như trình biên dịch không giống như tôi cố gắng chụp bên trong ví dụ trong tương lai các biến đã được capture bởi phương thức group.run().

Nếu tôi có thể tạo bản sao địa phương hoạt động:

group.run([&fn, workData](){ 
    Functor& fnlocal = fn; 
    WorkData workDatalocal = workData; 

    async_future<ProcessorResult> future([&fnlocal, workDatalocal]() -> ProcessorResult{ 
    ProcessorResult result = fnlocal.Process(workDatalocal); 

    return result; 
    }); 
}); 

là hành vi này tuân thủ QTI? Tôi luôn luôn cần phải tạo bản sao của các biến bị bắt để nắm bắt các biến tương tự trên một lambda lồng nhau?

+0

Văn phòng Chính phủ - các tính năng như thế này là lý do tôi không có lãi nhiều trong C++ 11. –

+0

:-) Có, nhưng họ sửa chữa nó – Ghita

+0

họ sửa chữa * những gì *? Tôi đã không nói về lỗi trình biên dịch, tôi đã nói về các mụn cóc gắn liền với ngôn ngữ. –

Trả lời

4

Nó không phù hợp với bản nháp cuối cùng, nhưng phù hợp với từ ngữ tại thời điểm chúng được triển khai, nó không thực sự là lỗi VS nhưng không chính xác. Phiên bản tiếp theo, thông tục được gọi là vNext, sẽ có một bản cập nhật được thực hiện để sử dụng từ ngữ mới nhất.