在内在的lambda中悬空引用

时间:2017-04-24 09:10:35

标签: c++ c++11 lambda dangling-pointer

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

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

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

tried它。它运作良好。但是,我想确保这里没有悬空参考。有吗?

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:7)

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

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

如果你传递(副本)你的lambda对象在那个块范围之外,那么你可以引起一个悬空引用。

答案 2 :(得分:3)

如果你在不使用lambdas的情况下重写代码,那么我认为很明显没有悬空引用,只是对仍在范围内的变量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; } 的引用:

SELECT t_a.*, EXTRACT(EPOCH FROM (t_a.event_time - t_b.event_time))
FROM 
(SELECT nodeid, code, event_time, dense_rank() over (partition by node_id order by event_time) as rnk
 FROM table) t_a 
JOIN
(SELECT nodeid, code, event_time, dense_rank() over (partition by node_id order by event_time) as rnk 
 FROM table) t_b 
ON (t_a.nodeid=t_b.nodeid and t_a.rnk + 1 = t_b.rnk)