返回对犰狳矢量元素的引用

Return a reference to a Armadillo vector element

本文关键字:元素 引用 返回      更新时间:2023-10-16

我很难确定如何返回对犰狳载体元素的引用。

例如

arma::vec3 v = arma::zeros(3);
v.at(0) = 1; // works as expected, surely this means the at() method returns a reference?

但是,这不会编译:

struct Custom {
  arma::vec3 v;
  double& x() { return v.at(0) }
}
Custom custom;
custom.x() = 1;

错误如下:

错误:从类型"const Double"的表达式初始化类型"double&"的引用无效

我认为这是因为 at() 返回副本而不是引用,但是前面的示例如何工作?

我相信这可能是因为返回的犰狳胶水类型而不是真正的"双",但我找不到任何关于这些的文档,所以我不确定如何使用它们。


以下方法有效,提供对矢量元素的"类似引用"命名访问。

inline double x() const { return at(0); }
inline double& x() { return at(0); }
inline double y() const { return at(1); }
inline double& y() { return at(1); }
inline double z() const { return at(2); }
inline double& z() { return at(2); }
inline const arma::subview_col<double> xy() const { return rows(0,1); }
inline arma::subview_col<double> xy() { return rows(0,1); }

at(0)几乎肯定返回一个代理对象,可以转换为double,或者被分配一个double,但实际上不是一个引用。这可能是为了避免悬而未决的引用,或者允许高效存储稀疏矩阵。不幸的是,犰狳的文档在语义上非常安静,但它没有指定at返回引用。

这表明不鼓励您返回引用。有没有另一种方法可以实现你想要的?