Рассмотрим это:
#include <functional>
#include <iostream>
std::function<void()> make_function(int& x) {
return [&]{ std::cout << x << std::endl; };
}
int main() {
int i = 3;
auto f = make_function(i);
i = 5;
f();
}
Гарантируется ли этой программе вывод 5
без вызова поведения undefined?
Я понимаю, как это работает, если я фиксирую x
по значению ([=]
), но я не уверен, вызываю ли я поведение undefined путем его захвата по ссылке. Может быть, я вернусь к обвисшей ссылке после того, как make_function
вернется, или гарантированное выполнение захваченного задания будет продолжаться до тех пор, пока объект, на который ссылается исходный объект, все еще существует?
Ищем окончательные ответы на основе стандартов здесь:) Это работает достаточно хорошо на практике до сих пор;)