2012-03-31 48 views
12

我編這個使用Visual Studio 2010的編譯器,它有嵌套拉姆達捕獲由第一拉姆達已經捕獲的變量編譯器錯誤的問題:嵌套LAMBDA捕獲問題

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; 
    }); 
}); 

這種行爲是符合的?我總是需要製作捕獲的變量的副本,以便在嵌套的lambda上捕獲相同的變量?

+0

OOG - 這樣的功能我沒有用C多大興趣的原因++ 11。 – 2012-03-31 20:10:21

+0

:-)是的,但他們修復它 – Ghita 2012-03-31 20:10:51

+0

他們修復*什麼*?我不是在談論編譯器錯誤,而是在談論附加在語言上的瑕疵。 – 2012-03-31 20:19:56

回答

4

它不符合最終草案,但它符合它們實施時的措辭 - 即它不是一個真正的VS缺陷,但它也不是完全標準。下一個版本俗稱爲vNext,將會更新實施以使用最新的措辭。