不需要/意​​外的编译器 - 魔法与特征和三元运算符

时间:2017-05-23 20:49:11

标签: c++ eigen

以下代码意外地按预期分配(0,-1,0)而不是(0,1,0)。为什么?有什么想法吗?

#include <Eigen/Dense>

int main()
{
  const bool useFirst = false;

  // This is the original use-case.
  const Eigen::Vector3d vect1
    = useFirst ? -Eigen::Vector3d::UnitZ() : Eigen::Vector3d::UnitY();

  // This version is somewhat simplified, but exhibits the same problem.
  const Eigen::Vector3d unitZ(0.0, 0.0, 1.0), unitY(0.0, 1.0, 0.0);
  const Eigen::Vector3d vect2 = useFirst ? -unitZ : unitY;

  // FYI, this version does not compile (?).
  // const Eigen::Vector3d vect3
  //   = useFirst ? -unitZ : Eigen::Vector3d::UnitY();
}

1 个答案:

答案 0 :(得分:3)

如果-unitZconst CwiseUnaryOp<internal::scalar_opposite_op<double>, const Vector3d>unitZ会返回表达式模板Vector3d,会发生什么情况。在Eigen的早期版本中,?:运算符的'else'参数被隐式转换为该类型,因此不自觉地否定了它。通过制作大多数构造函数explicit,前一段时间不允许这样做 - 首先,您应该更新您的Eigen版本。

对于实际解决方案:避免使用具有Eigen表达式的?:运算符(使用简单的if-else分支),或者如果不可能,则将最后一个参数显式地转换为所需类型:

typedef Eigen::Vector3d Vec3d;
const Vec3d vect1 = useFirst ? Vec3d(-Vec3d::UnitZ()) : Vec3d(Vec3d::UnitY());

相关问题:Type error in ternary operator in Eigen