【发布时间】:2017-12-01 20:05:17
【问题描述】:
考虑一下:
#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 返回后我会得到一个悬空引用,或者只要最初引用的对象仍然存在,捕获的引用就可以保证工作?
在这里寻找基于标准的明确答案 :) 它在实践中运行良好到目前为止 ;)
【问题讨论】:
-
请注意,捕获
x位置的另一个安全解决方案是:std::function<void()> make_function(int& x) { auto px = &x; return [=](){ std::cout << *px << std::endl; }; } -
是的,这值得一提。谢谢。
-
刚刚更新了上面的评论,表明参数可以作为参考。重要的是按值关闭指针。
-
真的有“引用引用”之类的东西吗?我的理解一直是,任何引用都只是对原始实例的引用,而不是可能从中创建的引用。即,即使存在从其他引用生成的引用链,只要原始项目仍然是最新的,临时引用也可以超出范围而不会影响从它们创建的引用。
标签: c++ c++11 lambda language-lawyer