14

我有一个内部 lambda,它使用外部 lambda 的引用变量之一,如下所示:

int x=0;
auto outer=[&](){
   return [&](){
        x=5;
    };
};

auto inner= outer();
inner();
std::cout << x;

试过了。它运作良好。但是,我想确保这里没有悬空引用。在那儿?

4

3 回答 3

16

这里没有悬空的参考。内部 lambda 的引用不是对引用的引用(没有这样的东西);它指的是x- 当然没有超出范围。

于 2017-04-24T09:31:18.977 回答
7

如图所示,您在x声明的块范围内调用 lambda,并且没有悬空引用。

值得注意的是,内部匿名 lambdax直接从最外面的块范围而不是外部 lambda 捕获对的引用,因为它正在寻找声明。

如果您在该块范围之外传递(副本)您的 lambda 对象,那么您可能会导致悬空引用。

于 2017-04-24T09:39:30.067 回答
4

如果您在不使用 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;
}
于 2017-04-24T09:35:51.320 回答