Правильное использование Eigen :: Ref & lt; & gt; учебный класс

Эйген представил Реф<> Класс для написания функций с объектами Eigen в качестве параметров без использования ненужных временных значений, когда написание шаблонных функций не требуется. Об этом можно прочитать Вот.

При поиске в интернете я нашел несколько разных объявлений параметров, используя<> класс. В документации 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>

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

18

Решение

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

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

20

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector