我使用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;
}
结果:
resAuto = -24.9536,-29.3876,65.801
resVector3 = -24.9536,-29.3876,83.77
按任意键继续。 。
我知道Eigen会进行内部优化,从而产生不同的结果。但它看起来像是Eigen和C ++ 11中的一个错误。
答案 0 :(得分:3)
auto
关键字告诉编译器&#34;猜测&#34;基于=
右侧的最佳对象。您可以通过添加
std::cout << typeid(resAuto).name() <<std::endl;
std::cout << typeid(resVector3).name() <<std::endl;
到foo
(不要忘记包含<typeinfo>
)。
在这种情况下,在构造临时Vector3
之后,将调用operator+
方法,从而创建CwiseBinaryOp
对象。此对象是Eigens lazy evaluation的一部分(可以提高性能)。如果您想强制进行急切评估(以及类型确定),可以使用
const auto resAuto = (Ha + Vector3(0.,0.,j * 2.567)).eval();
代替foo
中的行。
一些附注:
Vector3
与Eigen Vector3d
类相同
#include <Eigen/Core>
代替#include <Eigen/Geometry>
来包含大部分Eigen标头,还可以在那里定义某些内容。