C++11 使用带有特征值的auto的错误结果

C++11 使用带有特征值的auto的错误结果,c++11,eigen,C++11,Eigen,当两个向量求和时,我使用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)

当两个向量求和时,我使用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;
}
#包括“stdafx.h”
#包括
#包括“D:\externals\eigen\u3\u1\u2\include\eigen\Geometry”
typedef特征::矩阵向量3;
void foo(常量向量3和Ha,volatile int j)
{
const auto resAuto=Ha+Vector3(0,0,j*2.567);
常量向量3 resVector3=Ha+Vector3(0,0,j*2.567);

std::cout关键字
auto
告诉编译器根据
=
的右侧“猜测”最佳对象。您可以通过添加

std::cout << typeid(resAuto).name() <<std::endl;
std::cout << typeid(resVector3).name() <<std::endl;
而不是您在
foo
中的行

一些旁注:

  • Vector3
    与在Eigen中定义的
    Vector3d
    类相同
  • 您可以使用
    #include
    而不是
    #include
    来包含大多数特征头,以及在那里定义的某些应该包含的内容

如果听起来像是“Eigen和C++11中的一个bug”,那么可能不是。请仔细阅读文档,仔细关注表达式模板。对于我来说,Eigen 3.2.2.expression模板和其他返回代理类型的类(vector::operator[](size_t))非常有效当与auto一起使用时,可能会令人惊讶。您得到的不是矢量和,而是一种存储两个矢量和表达式的类型。这是一种模板优化,通常用于大型对象的实时矩阵。在其他新闻中,有一个“operator auto”的建议,允许使用特征类a我知道gcc,我想clang已经偷偷把它放进去了。也许你可以破解一下自己的“操作员自动”看看。
const auto resAuto = (Ha + Vector3(0.,0.,j * 2.567)).eval();