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- i.e., 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With