Проблема с вложенным лямбда-захватом - PullRequest
12 голосов
/ 01 апреля 2012

Я скомпилировал это с помощью компилятора 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;
    });
});

Соответствует ли это поведение?Мне всегда нужно делать копии захваченных переменных, чтобы захватывать одни и те же переменные во вложенной лямбде?

Ответы [ 2 ]

13 голосов
/ 01 апреля 2012

Это известное ограничение компилятора Visual Studio 2010 C ++.Вот проблема отслеживания соединения:

В настоящее время она помечена как исправленная в следующей версии

4 голосов
/ 01 апреля 2012

Он не соответствует окончательному проекту, но он соответствует в соответствии с формулировками в то время, когда они были реализованы, т.е. это не совсем дефект VS, но и не является абсолютно стандартным. Следующая версия, известная как vNext, будет иметь реализацию, обновленную для использования последней редакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...