Следующий код работает отлично:Статические переменные в C++ Лямбдами
#include <iostream>
#include <functional>
std::function<int (void)> get_incrementer() {
return []() {
static int count = 0;
return count++;
};
}
int main() {
using std::cout;
auto incrementer = get_incrementer();
cout << incrementer() << std::endl;
cout << incrementer() << std::endl;
return 0;
}
Но если вы захватываете локальную переменную по ссылке, а она вдруг результаты к неопределенному поведению, presumely, потому что в время вызова, что расположение в стеке используется другим.
std::function<int (void)> get_incrementer() {
int count = 0;
return [&count]() {
return count++;
};
}
Почему компилятор разрешает это? Я ожидал, что компилятор либо не допустит этого (кажется тривиальным проверить этот случай), либо изменить продолжительность хранения локальной переменной.
Кажется тривиальным проверить, не лямбда, которая захватывает переменные внутри области действия, чтобы оставить эту область. – Overv
@Overv: «Лямбда» - это не какая-то специальная конструкция; это просто сокращенный способ написания простого класса функторов и создания для него экземпляра. Это означает, что компилятор не может относиться к ним иначе, чем к определенному пользователем классу. Просто потому, что что-то «кажется тривиальным» не делает * его тривиальным. –
Если я хочу получить поведение последнего случая, должен ли я вместо этого создать функтор? – Overv