内部 lambda 中的悬挂引用
Dangling reference in inner lambda
我有一个内部 lambda,它使用外部 lambda 的引用变量之一,如下所示:
int x=0;
auto outer=[&](){
return [&](){
x=5;
};
};
auto inner= outer();
inner();
std::cout << x;
我tried它。它运作良好。但是,我想确保这里没有悬空引用。有吗?
这里没有悬空引用。内部 lambda 的引用不是对引用的引用(没有这种东西);它指的是 x
- 当然没有超出范围。
如果您在不使用 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;
}
如图所示,您在声明 x
的块范围内调用 lambda,并且没有悬空引用。
值得注意的是,内部匿名 lambda 直接从最外层的块范围而不是从外部 lambda 捕获对 x
的引用,因为它正在寻找声明。
如果您在该块范围之外传递您的 lambda 对象(的副本),然后您可能会导致悬空引用。
我有一个内部 lambda,它使用外部 lambda 的引用变量之一,如下所示:
int x=0;
auto outer=[&](){
return [&](){
x=5;
};
};
auto inner= outer();
inner();
std::cout << x;
我tried它。它运作良好。但是,我想确保这里没有悬空引用。有吗?
这里没有悬空引用。内部 lambda 的引用不是对引用的引用(没有这种东西);它指的是 x
- 当然没有超出范围。
如果您在不使用 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;
}
如图所示,您在声明 x
的块范围内调用 lambda,并且没有悬空引用。
值得注意的是,内部匿名 lambda 直接从最外层的块范围而不是从外部 lambda 捕获对 x
的引用,因为它正在寻找声明。
如果您在该块范围之外传递您的 lambda 对象(的副本),然后您可能会导致悬空引用。