我有一个内部 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,并且没有悬空引用。
值得注意的是,内部匿名 lambdax
直接从最外面的块范围而不是外部 lambda 捕获对的引用,因为它正在寻找声明。
如果您在该块范围之外传递(副本)您的 lambda 对象,那么您可能会导致悬空引用。
如果您在不使用 lambdas 的情况下重写代码,那么我认为很明显没有悬空引用,只是对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;
}