从arma::subvec的类型的右值初始化类型的非常量引用无效



向量y_long_name有100个成员,我计划只操作由前三个成员组成的子向量。subvector函数在我的代码中使用得像一个左值:

y_long_name.subvec(0,2)=A*x1;

然而,C++并不认为它是一个左值。如何定义要使用的yr而不是y_long_name.subvec(0,2)

我想做的是使用缩写yr而不是y_long_name.subvec(0,2),但不使用宏。

#include <iostream>
#include <armadillo>
int main()
{
    const arma::vec::fixed<3> x1={1.2,3.5,-0.27};   
    arma::mat::fixed<3,3> A={{5,3,6},{8,2,11},{7,5,9}};
    arma::vec::fixed<3> y1=A*x1; // ok
    arma::vec::fixed<100> y_long_name;
    y_long_name.subvec(0,2)=A*x1; // ok
    arma::vec::fixed<3>& yr=y_long_name.subvec(0,2);
    yr=A*x1;
    y_long_name.print();
    return 0;
}

错误:

test.cpp: In function ‘int main()’:
test.cpp:14:48: error: invalid initialization of non-const reference of type ‘arma::Col<double>::fixed<3ull>&’ from an rvalue of type ‘arma::subview_col<double>’
  arma::vec::fixed<3>& yr=y_long_name.subvec(0,2)

在访问子视图的同时,您似乎试图避免使用子视图。一般不建议这样做。然而,有一种不安全的方法可以通过使用指向外部内存的向量构造函数来实现这一点。例如:

vec a(10, fill::zeros);
double* a_data = a.memptr();
vec b( &a_data[5], 2, false, true );  // create 'b from part of vector 'a'
b(0) = 123.0;  // changing elements in vector 'b' will also change 'a'
a.print("a:");

请注意,上面的操作是不安全的,因为分配给"a"使用的内存可以由应用于"a"的任何操作释放和重新分配。然后,向量"b"将使用指向无效内存的指针。换句话说,只有当你真的知道自己在做什么的时候,才使用上面的技巧。

subvec不返回vec;它将视图转换为原始向量,可以将其转换为临时vec,不能将非常量引用绑定到该向量。

因此,您强制使用了错误的yr类型,这就是问题的根源。最好不要指定它,只使用subvec给你的类型:

auto & yr = y_long_name.subvec(0,2);

或者,因为你实际上并不需要参考:

auto yr = y_long_name.subvec(0,2);

相关内容

最新更新