РезюмеC++ лямбда лексического замыкание над локальными переменными
В C++, когда я вернусь лямбда из функции, которая захваченной локальной переменной этой функции, что конкретно происходит, и почему? Компилятор (g ++), похоже, позволяет это, но это дает мне разные результаты, чем я ожидал, поэтому я не уверен, что это технически безопасно/поддерживается.
Подробности
В некоторых языках (Swift, Lisp и т.д.) вы можете захватить локальные переменные в замыкания/лямбда, и они остаются в силе и в объеме, пока крышка находится в области (I «Я слышал, что он называется« лямбда над let lambda »в контексте Lisp). Например, в Swift, пример кода для того, что я пытаюсь сделать, это:
func counter(initial: Int) -> (() -> Int) {
var count = initial
return { count += 1; return count }
}
let c = counter(initial: 0)
c() // returns 1
c() // returns 2
c() // returns 3
Я попытался написать C++ эквивалент этого, как в следующем:
auto counter(int initial)
{
int count = initial;
return [&count]() -> int {
count = count + 1;
return count;
};
}
Однако результат Я получаю:
auto c = counter(0);
std::cout << c() << std::endl; // prints 1
std::cout << c() << std::endl; // prints 1
std::cout << c() << std::endl; // prints 1
Если я захвачу переменной, которая до сих пор в рамках, он работает, как я ожидал. Например, если я все следующие в одной функции:
int count = 0;
auto c = [&count]() -> int {
count = count + 1;
return count;
};
std::cout << c() << std::endl; // prints 1
std::cout << c() << std::endl; // prints 2
std::cout << c() << std::endl; // prints 3
Так что я думаю, мой вопрос, в первую C++, например, выше, чем на самом деле получение захватили? И определяется ли это поведение, или я просто имею ссылку на случайную память в стеке?
Я не понимаю эту строку 'auto c = counter();'. Как вы можете вызвать функцию без аргумента? Похоже, это даже не компилируется. – Richard
@Richard, исправленный, извините за это. –
В первом случае у вас есть ссылка на случайную память в стеке. – user1438832