正确使用Eigen :: Ref <>类

Nik*_*ann 21 c++ parameters pass-by-reference eigen eigen3

当不需要编写模板函数时,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使用和参考的每种可能组合.

gga*_*ael 21

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

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

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

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

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

  • 你能详细说明为什么你会推荐`const Ref <const T>&`(用`&`)而不是`const Ref <const T>`(没有`&`)?它似乎没有`&`它涉及Ref对象的副本(我认为它很便宜).在非const情况下,Ref对象反正被复制了吗?通过`Ref&`与`Ref`时,性能会有所不同? (3认同)
  • 如果为 const 情况创建临时变量,有没有办法发出警告,或者出现编译错误? (2认同)