在函数模板中返回局部变量

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)

Ted*_*gmo 5

这里有延长寿命的场景吗?

一点都不。该函数返回一个按值捕获的 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)