Ответ 1
Это известное ограничение компилятора Visual Studio 2010 С++. Вот проблема подключения, отслеживающая ее
В настоящее время он помечен как исправленный в следующей версии
Я скомпилировал это с помощью компилятора Visual Studio 2010 и у него возникли ошибки при компиляции на вложенной лямбда, захватывающей переменные, захваченные уже первой лямбдой:
Functor& fn, const WorkData& workData
group.run([&fn, workData](){
async_future<ProcessorResult> future([&fn, workData]() -> ProcessorResult{
ProcessorResult result = fn.Process(workData);
return result;
});
});
Я получаю:
**error C3480**: '`anonymous-namespace'::<lambda3>::fn': a lambda capture variable must be from an enclosing function scope
Кажется, компилятору не нравится, что я пытаюсь захватить внутри будущего экземпляра переменные, захваченные уже методом group.run().
Если я создаю локальные копии, он работает:
group.run([&fn, workData](){
Functor& fnlocal = fn;
WorkData workDatalocal = workData;
async_future<ProcessorResult> future([&fnlocal, workDatalocal]() -> ProcessorResult{
ProcessorResult result = fnlocal.Process(workDatalocal);
return result;
});
});
Согласуется ли это поведение? Мне всегда нужно делать копии захваченных переменных, чтобы фиксировать одни и те же переменные на вложенной лямбда?
Это известное ограничение компилятора Visual Studio 2010 С++. Вот проблема подключения, отслеживающая ее
В настоящее время он помечен как исправленный в следующей версии
Это не соответствует окончательному проекту, но соответствует его формулировке в то время, когда они были реализованы, т.е. на самом деле это не дефект VS, но он не является стандартным. Следующая версия, известная как vNext, будет обновлена для использования последней редакции.