错误使用自动类型说明符并传递引用变量

问题描述 投票:0回答:1

我有一个主要功能,看起来像:

#include <iostream>
#include <vector>
#include <Eigen/Dense>

using Eigen::Vector3d;
using namespace std;

void ext_func(vector<Vector3d> &a, vector<Vector3d> &b, vector<Vector3d> &c);
int main()
{
    vector<Vector3d> a = {};
    a.push_back(Vector3d(1.,1.,0.));
    a.push_back(Vector3d(2.,1.,0.));

    vector<Vector3d> b = {};
    b.push_back(Vector3d(.5,.7,2.));
    b.push_back(Vector3d(0.,.2,-1.2));

    vector<Vector3d> c = {};
    c.push_back(Vector3d::Zero());
    c.push_back(Vector3d::Zero());

    ext_func(a,b,c);

}

main,我调用一个外部函数:

void ext_func(vector<Vector3d> &a, vector<Vector3d> &b, vector<Vector3d> &c)
{
    double fac = 0.01;
    for (size_t i = 0; i < a.size(); i++) {
        auto a_temp = a[i] + fac * b[i] / 50.;
        cout << "Before" << endl << fac*a_temp << endl;
        a[i] = a_temp;
        c[i] += fac*a_temp;
        cout << "After" << endl << fac*a_temp << endl << endl;
    }
}

输出为:

Before
 0.010001
0.0100014
    4e-06
After
 0.010002
0.0100028
    8e-06

Before
     0.02
0.0100004
 -2.4e-06
After
     0.02
0.0100008
 -4.8e-06

这不是我想要的(我希望a_temp在分配后保持不变)。我知道问题在于我为&a分配了一个新值,所以当我调用a_temp时,我基本上是在第二次增加我的初始a[i]。通过将auto替换为Vector3dVector3d&&,可以解决该问题。

我不确定auto在这里实际在做什么。

c++ pass-by-reference auto
1个回答
1
投票

[在本征库中使用矩阵进行计算时,重载的运算符将返回一个代表计算表达式的对象。该表达式尚未求值(即,尚未执行实际计算)。

在您的示例中,由auto派生的类型是Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<double>, const Eigen::Matrix<double, 3, 1>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_quotient1_op<double>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>, const Eigen::Matrix<double, 3, 1>>>>

© www.soinside.com 2019 - 2024. All rights reserved.