No C ++ 11, quando as variáveis vinculadas de uma expressão lambda devem ser capturadas por valor?

Tenho um programa C ++ do Visual Studio 2010, cuja principal função é:

vector<double> v(10);

double start = 0.0; double increment = 10.0;
auto f = [&start, increment]() { return start += increment; };
generate(v.begin(), v.end(), f);
for(auto it = v.cbegin(); it != v.cend(); ++it) { cout << *it << ", "; }

cout << endl << "Changing vars to try again..." << endl;
start = 15; i,ncrement = -1.5;
generate(v.begin(), v.end(), f);
for(auto it = v.cbegin(); it != v.cend(); ++it) { cout << *it << ", "; }
return 0;

Quando eu compilar isso no MS Visual Studio, a primeira geração faz o que eu esperava, resultando em "10, 20, ... 100". O segundo não; o lambda "vê" a mudança emstart mas não a mudança emincrement, então recebo "25, 35, ... 115".

MSDN explica qu

O compilador Visual C ++ vincula uma expressão lambda às suas variáveis capturadas quando a expressão é declarada em vez de quando a expressão é chamada. ... [A] reatribuição de [uma variável capturada por valor] posteriormente no programa não afeta o resultado da expressão.

Então, minha pergunta é: esse comportamento é C ++ 11 compatível com os padrões ou é a implementação excêntrica da Microsoft? Bônus: se for comportamento padrão, por que o padrão foi escrito dessa maneira? Isso tem a ver com a imposição de transparência referencial para programação funcional?

questionAnswers(4)

yourAnswerToTheQuestion