37

Eigen 引入了 Ref<> 类来编写以 Eigen 对象作为参数的函数,而无需使用不必要的临时变量,当不需要编写模板函数时。可以在这里阅读到这一点。

在进一步搜索互联网时,我发现了几种不同的使用 Ref<> 类的参数声明。在 Eigen 文档中,他们const Eigen::Ref<const Eigen::MatrixXf>&在第一个示例中使用只读参数。第二个例子Eigen::Ref<Eigen::MatrixXd>是针对读写参数介绍的,BUT这里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>

为了完整起见,我列出了 const 用法和参考的所有可能组合。

4

1 回答 1

35

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

案例 3 和案例 4 没有意义,它们通常不会编译。

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

所以总而言之,我们可以推荐Ref<T>一个可写引用和const Ref<const T>&一个 const 引用。

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

于 2014-01-15T13:10:27.423 回答