我在c ++中使用Eigen库并遇到了一个奇怪的问题。
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 :(得分:1)
Eigen使用表达式模板来优化表达式。这意味着返回类型不是Eigen::VectorXd
的实例,而是表示操作的模板,该操作在将其分配回向量时评估所有内容。在您的情况下,返回的类型是
Eigen::MatrixBase<Eigen::Matrix<double, -1, 1>>::ScalarMultipleReturnType
是
的typedefEigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>, const Eigen::Matrix<double, -1, 1>>
通常情况下,这很好,结果在分配时会转换回矢量。但是,在您的情况下,由于auto
被扣除为临时结果类型,因此不会将其转换回来。这可能不是图书馆作者的意图,也是打印时出现问题的原因。
对于第二种情况,auto
被推断为Eigen::VectorXd
类型。使用std::cout
打印时不会出现问题。