在内在的lambda中悬空引用

Hum*_*awi 13 c++ lambda c++11 dangling-pointer

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

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

auto inner= outer();
inner();
std::cout << x;
Run Code Online (Sandbox Code Playgroud)

试了一下.它运作良好.但是,我想确保这里没有悬空参考.在那儿?

eer*_*ika 15

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

  • 因此,确实不再存在"引用参考"这样的事情,而且从来没有真正存在过.但是C++ 11中存在一个缺陷,它将lambdas中引用捕获变量的生命周期与它们捕获的引用变量的生命周期联系起来,而不是它们引用的东西的生命周期.甚至优化相关的原因,这可能是一个好主意(因为它允许`[&]`lambdas捕获堆栈帧指针和可选的`this`指针,没有别的). (4认同)

Use*_*ess 7

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

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

如果将lambda对象的(副本)传递到该块作用域之外,可以引起悬空引用.