使用Auto与Eigen的错误结果

Rot*_*yut 7 eigen c++11

我使用auto得到了不同的结果,并Vector在求和两个向量时使用.

我的代码:

#include "stdafx.h"
#include <iostream>
#include "D:\externals\eigen_3_1_2\include\Eigen\Geometry"

typedef Eigen::Matrix<double, 3, 1>       Vector3;

void foo(const Vector3& Ha, volatile int j) 
{
    const auto resAuto = Ha + Vector3(0.,0.,j * 2.567);
    const Vector3 resVector3 = Ha + Vector3(0.,0.,j * 2.567);

    std::cout << "resAuto = " << resAuto <<std::endl;
    std::cout << "resVector3 = " << resVector3 <<std::endl;
}

int main(int argc, _TCHAR* argv[])
{
    Vector3 Ha(-24.9536,-29.3876,65.801);
    Vector3 z(0.,0.,2.567);

    int j = 7;

    foo(Ha,j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

resAuto = -24.9536,-29.3876,65.801

resVector3 = -24.9536,-29.3876,83.77

按任意键继续 ...

我知道Eigen会进行内部优化,从而产生不同的结果.但它看起来像是Eigen和C++ 11中的一个错误.

Avi*_*urg 5

auto关键字告诉编译器根据 的右侧“猜测”最佳对象=。您可以通过添加来检查结果

std::cout << typeid(resAuto).name() <<std::endl;
std::cout << typeid(resVector3).name() <<std::endl;
Run Code Online (Sandbox Code Playgroud)

foo(不要忘记包括<typeinfo>)。

在这种情况下,在构造临时 后Vector3operator+将调用该方法来创建一个CwiseBinaryOp对象。该对象是特征惰性求值的一部分(可以提高性能)。如果你想强制急切评估(因此类型确定),你可以使用

const auto resAuto = (Ha + Vector3(0.,0.,j * 2.567)).eval();
Run Code Online (Sandbox Code Playgroud)

而不是你的行foo

一些旁注:

  • Vector3Vector3d与Eigen 中定义的类相同
  • 您可以使用#include <Eigen/Core>而不是#include <Eigen/Geometry>包含大多数 Eigen 标头,以及应该在那里定义的某些内容。