我有一个内部Lambda,它使用了外部Lambda的一个引用变量,像这样:
int x=0;
auto outer=[&](){
return [&](){
x=5;
};
};
auto inner= outer();
inner();
std::cout << x;
我试过它。 它效果很好。 但是,我想确认这里没有悬挂的引用。 有吗?
我有一个内部Lambda,它使用了外部Lambda的一个引用变量,像这样:
int x=0;
auto outer=[&](){
return [&](){
x=5;
};
};
auto inner= outer();
inner();
std::cout << x;
我试过它。 它效果很好。 但是,我想确认这里没有悬挂的引用。 有吗?
这里不存在悬空引用。内部 lambda 的引用不是对引用的引用(这种事情是不存在的);它是对 x
的引用 - 当然,x
没有超出其作用域。
[&]
lambda捕获一个堆栈帧指针和可选的this
指针,而不是其他任何东西)。 - Yakk - Adam Nevraumont如上所示,您正在块作用域内调用lambda,其中声明了x
,并且没有悬空引用。
值得注意的是,内部匿名lambda直接从最外层块作用域捕获对x
的引用,而不是来自外部lambda,因为它正在寻找声明。
如果您将(副本)lambda对象传递到该块作用域之外,那么可能会导致悬空引用。
如果你重写代码而不使用lambda表达式,那么我认为很明显没有悬空引用,只是对一个仍然在作用域内的变量x
的引用:
class Inner {
int& x;
public:
Inner(int &x) : x(x) {}
void operator()(){
x = 5;
}
};
class Outer {
int& x;
public:
Outer(int &x) : x(x) {}
Inner operator()(){
return {x};
}
};
int main() {
int x=0;
auto outer = Outer{x};
auto inner = outer();
inner();
std::cout << x;
}