我想制作一个返回本征表达式的函数。该表达式的某些输入是该函数中的局部变量。但是,当函数返回时,这些局部变量超出范围。稍后在对表达式求值时,读取了一些垃圾数据,从而产生错误的结果。
简单示例:
template<typename T>
auto f(const T& x){
Eigen::ArrayXXd temp = exp(x);
return temp * (1 - temp);
}
是否有一种方法可以将这样的局部变量的生存期延长到表达式的生存期?还是除了从函数返回结果之前没有其他方法可以评估结果?
自C ++ 14起,您可以使用init-capture list将temp
存储为由lambda表达式生成的闭包的数据成员:
template<typename T>
auto f2(const T& x) {
return [temp = exp(x).eval()](){ return temp * (1-temp); };
}
调用的语法很有趣:
Eigen::ArrayXXd y = f2(x)();
但是它按预期方式工作,因为由f2(x)
创建的临时对象在完整表达式的末尾被破坏,因此,由于y = ..
仍然有效,因此可以由temp
正确评估结果。