简体   繁体   中英

Nested Lambda capture issue

I have compiled this using Visual Studio 2010 compiler and it has compiler error issues on nested lambda capturing the variables captured already by the first lambda:

    Functor& fn, const WorkData& workData

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

    return result;
    });
});

I get:

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

It seems that the compiler does not like that I try to capture inside the future instance the variables captured already by the group.run() method.

If I create local copies it works:

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

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

    return result;
    });
});

Is this behavior conformant ? I always need to make copies of captured variables in order to capture the same variables on a nested lambda ?

This is a known limitation of the Visual Studio 2010 C++ compiler. Here is the connect issue tracking it

It's currently marked as fixed in the next version

It's not conformant to the final draft, but it is conformant to the wording at the time at which they were implemented- ie, it's not really a VS defect but neither is it exactly Standard. The next version, colloquially known as vNext, will have an implementation updated to use the latest wording.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM