显式类型声明在C ++中的特征表达式中自动为Vs

时间:2016-03-30 00:16:00

标签: c++ eigen

我在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不正确?

1 个答案:

答案 0 :(得分:1)

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

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

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

通常情况下,这很好,结果在分配时会转换回矢量。但是,在您的情况下,由于auto被扣除为临时结果类型,因此不会将其转换回来。这可能不是图书馆作者的意图,也是打印时出现问题的原因。

对于第二种情况,auto被推断为Eigen::VectorXd类型。使用std::cout打印时不会出现问题。