【发布时间】:2013-11-30 21:15:09
【问题描述】:
在this article 中,它说以下代码是有效的 C++11 并且可以与 GNU 的 libstdc++ 一起使用:
int n;
std::vector<int> v;
...
std::function<bool(int)> f(std::cref([n](int i) {return i%n == 0));
std::count_if(v.begin(), v.end(), f);
问题是我一直相信 lambda 对象是在调用站点创建的,是什么使它成为这个 sn-p 中的临时对象,因为它没有存储在任何变量上,而是一个 const 引用它正在被创建并传递给std::function。如果是这样,lambda 对象应该一直被销毁,在f 中留下一个悬空引用,这将导致std::count_if 使用时未定义的行为。
假设文章没有错,我的心智模型有什么问题? lambda对象什么时候被销毁?
【问题讨论】:
-
在我看来无效。
-
[expr.prim.lambda]/2 "对 lambda 表达式的计算会产生一个临时的纯右值。"在这种情况下,它甚至不能转换为函数指针,因为它的生命周期可能更长。