内部 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 对象(的副本),然后您可能会导致悬空引用。