2014-01-15 47 views
16

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

当进一步搜索互联网时,我发现使用Ref类的参数有几个不同的声明。在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>

为了完整性I所列常量使用和参考的每个可能的组合。

+1

就我个人而言,对于读写参数,我会使用'const Eigen :: Ref 作为只读参数和'Eigen :: Ref '。但我不确定引用('&')。 –

回答

19

一般来说,使用像Ref<T>&这样的非const引用永远不是一个好主意,因为这只有在调用者手头已有Ref<T>对象的情况下才有效。这丢弃5和7.

情况3和4没有意义,他们将不会编译通常。

然后,没有一个const Ref<const T>const Ref<const T>&太大的区别,因为它是不太可能的函数调用现有Ref<const T>对象,所以Ref<const T>将在大多数情况下,要创建反正。尽管如此,我们仍然可以推荐1个超过2或6.

因此,总而言之,我们可以推荐Ref<T>作为可写参考,而const Ref<const T>&作为const参考。

选项6,Ref<const T>,如果你想使用placement new通过调用所引用的基质(而不是它的内容)更改为Ref构造可能仍然很有趣。

+2

你能详细说明为什么你会推荐'const Ref &'(有'&')而不是'const Ref '(no'&')? 似乎没有'&'会涉及Ref对象的副本(我认为这很便宜)。在非常量情况下,Ref对象无论如何都被复制了吗?那么在传递'Ref&'与'Ref'时有什么不同呢? – Alejandro

+0

这是因为如果'T'是像Matrix4d那样的固定大小的静态分配类型,则Ref 必须存储'Matrix4d'作为属性,以防万一传递的对象不兼容。因此,与总是便宜的'Ref '不同,'Ref '可能更重。 – ggael

相关问题