Правильное использование класса Eigen:: Ref <>

Eigen вводил класс Ref < писать функции с Eigen-объектами в качестве параметров без использования ненужных временных рядов, когда писать функции шаблона не нужны. Здесь можно прочитать .

При дальнейшем поиске в Интернете я нашел несколько разных объявлений параметров с помощью класса Ref < > . В документации Eigen они используют const Eigen::Ref<const Eigen::MatrixXf>& для параметра только для чтения в первом примере. Во втором примере Eigen::Ref<Eigen::MatrixXd> вводится для параметров чтения и записи, НО здесь const Eigen::Ref<const Eigen::MatrixXd> используется для параметров только для чтения (без ссылки). Поэтому мой вопрос:

В чем разница между следующими объявлениями и когда я использую какой? `

  • const Eigen::Ref<const Eigen::MatrixXd>&
  • const Eigen::Ref<const Eigen::MatrixXd>
  • const Eigen::Ref<Eigen::MatrixXd>&
  • const Eigen::Ref<Eigen::MatrixXd>
  • Eigen::Ref<const Eigen::MatrixXd>&
  • Eigen::Ref<const Eigen::MatrixXd>
  • Eigen::Ref<Eigen::MatrixXd>&
  • Eigen::Ref<Eigen::MatrixXd>

Для полноты я перечислил все возможные комбинации использования константы и ссылки.

Ответы

Ответ 1

В общем случае использование ссылки не const, например Ref<T>&, никогда не является хорошей идеей, потому что это будет работать, только если у вызывающего уже есть объект Ref<T>. Это отбрасывает 5 и 7.

Случаи 3 и 4 не имеют смысла, и они вообще не будут компилироваться.

Тогда нет большой разницы между const Ref<const T> и a const Ref<const T>&, потому что маловероятно, что функция вызывается с существующим объектом Ref<const T>, и поэтому Ref<const T> нужно будет создать в большинстве в любом случае. Тем не менее, мы могли бы порекомендовать 1 более 2 или 6.

Итак, мы могли бы рекомендовать Ref<T> для записи, доступной для записи, и const Ref<const T>& для ссылки const.

Опция 6, Ref<const T> может по-прежнему быть интересной, если вы хотите изменить матрицу, на которую ссылается (а не ее содержимое), путем вызова конструктора Ref, используя размещение нового.