我有一个内部lambda,它使用外部lambda的一个引用变量,如下所示:
int x=0;
auto outer=[&](){
return [&](){
x=5;
};
};
auto inner= outer();
inner();
std::cout << x;
我tried它。它运作良好。但是,我想确保这里没有悬空参考。有吗?
答案 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)