我很难确定如何返回对犰狳矢量元素的引用。
e.g。
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); }
答案 0 :(得分:1)
at(0)
几乎肯定会返回一个代理对象,可以将其转换为double
,或者分配一个double
,但实际上并不是参考。这可能是为了避免悬空引用,或者允许有效存储稀疏矩阵。遗憾的是,Armadillo的documentation在语义上非常安静,但没有指定at
返回引用。
这表示不鼓励您返回引用。还有另一种方法可以达到你想要的效果吗?