Правильное использование класса 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
, используя размещение нового.