【发布时间】:2017-12-01 11:33:03
【问题描述】:
考虑一下:
#include <iostream>
#include <functional>
std::function<void()> task;
int x = 42;
struct Foo
{
int& x;
void bar()
{
task = [=]() { std::cout << x << '\n'; };
}
};
int main()
{
{
Foo f{x};
f.bar();
}
task();
}
我的直觉是,由于在执行任务时实际的引用仍然存在,我们在遇到 lambda 时得到一个新绑定的引用,一切都很好。
但是,在我的 GCC 4.8.5 (CentOS 7) 上,我看到一些行为(在更复杂的程序中)表明这是 UB,因为 f 和引用 f.x 本身已经死亡.对吗?
【问题讨论】:
-
我不确定我是否理解。在你绑定到
int& x的任务中,当Foo被销毁时它不再有效。 -
我想程序的“字面意思”阅读表明我正在捕获一个超出范围的
this,并且任务中的x只是一个现在无效的缩写this->x. -
@freakish:但我有吗?我没有将新变量绑定到
::x吗?r2绑定到int x = 42; int& r1 = x; int& r2 = r1;中的是什么? -
在显式
=的事实中,对x的令人讨厌的隐式捕获是真正的PITA。 -
@Bathsheba:我们有报酬吗? ;)