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

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

vector 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; increment = -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 , но не изменение в приращении , поэтому я получаю «25, 35, ... 115,».

MSDN объясняет , что

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

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

8
задан Evan Harper 24 October 2011 в 19:51
поделиться