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

时间:2016-01-03 07:34:06

标签: c++ c++11 rvalue-reference armadillo

向量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)

2 个答案:

答案 0 :(得分:1)

您仍在尝试避免在访问子视图时使用subviews。通常不建议这样做。但是,有一种不安全方法可以通过使用指向external memory指针的向量构造函数来实现此目的。例如:

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:");

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

答案 1 :(得分:0)

subvec不会返回vec;它将视图转换为原始向量,可以将其转换为临时vec - 您无法将非const引用绑定到。{/ p>

所以你强迫yr的错误类型,导致问题。最好不要指定它,只使用subvec给你的类型:

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

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

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