2016-03-30 19 views
0

我在C++中使用特征库,并遇到一个奇怪的问题。明确的类型声明Vs自动在特征表达式在C + +

Eigen::VectorXd someV(){ 
    Eigen::VectorXd a(3); 
    a(1)=1.2; 
    a(2)=2.3; 
    a(0)=3.2; 
    return a; 
} 

int main(){ 
    auto c=2.*someV(); 
    std::cout<<c; 
    return 0; 
} 

不返回任何东西。但是,

int main(){ 
    auto c=someV(); 
    c *= 2.; 
    std::cout<<c; 
    return 0; 
} 

返回所需的结果。还要注意显式类型声明解决了这个问题。

int main(){ 
    Eigen::VectorXd c=2.*someV(); 
    std::cout<<c; 
    return 0; 
} 

为什么在第一种情况下使用auto不正确?

+0

我会怀疑这与casts和'auto'的交互有关。你可以尝试不使用'auto',但要明确返回类型,看看行为是否有所不同? – TriskalJM

+0

你得到了什么样的价值观,你期望什么样的价值? – comingstorm

+0

请包括SSCCE(http://sscce.org/),以便我们不必猜测输入是什么,结果与预期结果不同等。 – NPE

回答

1

Eigen使用表达式模板来优化表达式。这意味着返回类型不是Eigen::VectorXd的一个实例,而是一个代表操作的模板,该操作在将其分配回向量时评估所有内容。在你的情况返回的类型是类型

Eigen::MatrixBase<Eigen::Matrix<double, -1, 1>>::ScalarMultipleReturnType 

Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>, const Eigen::Matrix<double, -1, 1>> 

通常的一个typedef的,这将是细,其结果是,当它被分配被转换回的载体。就你而言,它不会被转换回来,因为auto被扣除为临时结果类型。这可能不是图书馆作者的意图,也是你印刷印刷时遇到的问题的原因。

在第二种情况下,auto被推断为Eigen::VectorXd类型。使用std::cout打印时,这没有任何问题。

+1

实际上,如果你不知道自己在做什么,这是一个非常常见的错误,[作者警告](http://eigen.tuxfamily.org/dox/TopicPitfalls.html)关于使用'auto'。 –

+2

更准确地说,这里的真正问题是'CwiseUnaryOp'类型的对象'c'存储对'someV'返回的向量的引用。这个临时被删除后,这个参考因此变得无效......另一方面,以下是好的:'cout << 2. * someV();' – ggael