В C ++ 11, когда предполагаемые переменные лямбда-выражения должны быть захвачены по значению?

У меня есть программа Visual Studio 2010 C ++, основной функцией которой является:

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;

Когда я компилирую это в MS Visual Studio, первое генерирование делает то, что я ожидал, что приводит к «10, 20, ... 100,». Второй нет; лямбда "видит" изменения вstart но не изменение вincrement, поэтому я получаю "25, 35, ... 115,".

MSDN объясняет это

Компилятор Visual C ++ связывает лямбда-выражение с захваченными переменными при объявлении выражения, а не при вызове выражения. ... [T] переназначение [переменной, захваченной значением] позже в программе, не влияет на результат выражения.

Итак, мой вопрос: соответствует ли это стандартному поведению C ++ 11 или это собственная эксцентричная реализация Microsoft? Бонус: если этоявляется стандартное поведение, почему стандарт был написан таким образом? Связано ли это с обеспечением ссылочной прозрачности для функционального программирования?

Ответы на вопрос(4)

Ваш ответ на вопрос