正确使用Eigen :: Ref<>类

时间:2014-01-15 08:36:13

标签: c++ parameters pass-by-reference eigen eigen3

Eigen引入了Ref<>在不需要编写模板函数时,使用Eigen对象作为参数来编写函数而不使用不必要的临时函数的类。人们可以阅读这个here

当进一步搜索互联网时,我使用Ref&lt;&gt;找到了几个不同的参数声明。类。在Eigen文档中,他们使用const Eigen::Ref<const Eigen::MatrixXf>&作为第一个示例中的只读参数。在第二个示例中,引入了Eigen::Ref<Eigen::MatrixXd>用于读写参数,但是此处const Eigen::Ref<const Eigen::MatrixXd>用于只读参数(无引用)。所以我的问题是:

以下声明之间的区别是什么?我何时使用哪个声明?`

  1. const Eigen::Ref<const Eigen::MatrixXd>&
  2. const Eigen::Ref<const Eigen::MatrixXd>
  3. const Eigen::Ref<Eigen::MatrixXd>&
  4. const Eigen::Ref<Eigen::MatrixXd>
  5. Eigen::Ref<const Eigen::MatrixXd>&
  6. Eigen::Ref<const Eigen::MatrixXd>
  7. Eigen::Ref<Eigen::MatrixXd>&
  8. Eigen::Ref<Eigen::MatrixXd>
  9. 为了完整性,我列出了const使用和参考的每种可能组合。

1 个答案:

答案 0 :(得分:20)

通常,使用像Ref<T>&这样的非常量引用绝不是一个好主意,因为这只有在调用者手头有Ref<T>个对象时才有效。这将丢弃5和7。

案例3和案例4没有意义,一般都不会编译。

然后,const Ref<const T>const Ref<const T>&之间没有太大区别,因为不太可能使用现有的Ref<const T>对象调用该函数,因此{{1}无论如何,必须在大多数情况下创建。尽管如此,我们仍然可以推荐1比2或6。

总而言之,我们可以推荐Ref<const T>作为可写引用,Ref<T>作为const引用。

如果您想通过使用placement new调用const Ref<const T>&构造函数来更改引用的矩阵(而不是其内容),则选项6 Ref<const T>可能仍然很有趣。< / p>