如何通过引用传递XTensor数组以实现原地修改?
XTensor原地修改数组的编译错误解决方法
问题原因
xt::linspace返回的并非直接是xt::xarray<double>,而是一个表达式模板对象(具体类型为xt::xgenerator)。当你用auto tmp接收时,tmp的类型是这个表达式类型,而非xt::xarray<double>。调用modifyXArray时,会触发隐式构造生成临时的xt::xarray<double>对象,但C++不允许将非const左值引用绑定到临时对象,因此抛出编译错误。
解决方案
方案1:显式转换为xt::xarray
直接将linspace的结果构造为xt::xarray<double>,确保tmp是可修改的左值:
xt::xarray<double> tmp = xt::linspace(0, 1, 100); modifyXArray(tmp);
方案2:使用通用表达式模板参数(推荐)
修改函数为模板函数,接受所有XTensor可修改的表达式类型,无需显式转换且支持更多张量类型:
template<typename E> void modifyXArray(xt::xexpression<E>& arr) { arr.derived_cast() += 1; }
derived_cast()用于获取表达式底层的可修改对象,确保能执行原地修改操作。
方案3:重载右值引用版本
如果仅针对xt::xarray<double>,可以添加右值引用重载,允许临时对象传入:
void modifyXArray(xt::xarray<double>& arr) { arr += 1; } // 右值引用重载,处理临时xarray对象 void modifyXArray(xt::xarray<double>&& arr) { arr += 1; }
此方案仅适用于xt::xarray<double>类型,扩展性不如模板方案。
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

