ter*_*rto 3 c++ lambda lifetime c++11
在下面的示例中,函数模板返回一个局部变量,即使返回值不是引用,它也会按预期工作。这里有延长寿命的场景吗?“result”变量是本地变量,编译器不会生成任何消息,并且代码也可以正常工作。我预计它会失败,因为返回语句中使用了局部变量,但它有效。
template <typename F>
auto foo(const F& f)
{
return [f](const std::vector<double>& v)
{
std::vector<double> result(v.size());
std::transform(v.begin(), v.end(), result.begin(), f);
return result;
};
}
Run Code Online (Sandbox Code Playgroud)
这里有延长寿命的场景吗?
一点都不。该函数返回一个按值捕获的 lambda(不引用局部变量)。它携带自己的数据,因此在生命周期方面是 100% 安全的。
“结果”变量是本地变量
在调用返回的 lambda 的调用运算符之前,它甚至不会存在。然后它将成为一个局部变量 - 最有可能通过命名返回值优化而消除。
它如何存储结果变量?
完全就像您创建了一个带有成员的本地类,实例化它并返回实例:
struct my_lambda {
std::vector<double> operator()(const std::vector<double>& v) const {
std::vector<double> result(v.size());
std::transform(v.begin(), v.end(), result.begin(), f);
return result;
}
F f;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |