想想这个:
#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
吗?
我知道通过值捕获 x
([=]
)是如何工作的,但我不确定是否通过引用捕获它来调用未定义行为。是否在 make_function
返回之后我将得到一个悬空引用,或者只要原始引用的对象仍然存在,捕获的引用就保证能够工作?
在这里寻找基于标准的明确答案:)它在实践 目前为止中工作得很好;)