Эйген представил Реф<> Класс для написания функций с объектами Eigen в качестве параметров без использования ненужных временных значений, когда написание шаблонных функций не требуется. Об этом можно прочитать Вот.
При поиске в интернете я нашел несколько разных объявлений параметров, используя<> класс. В документации 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>
Для полноты я перечислил все возможные комбинации использования const и ссылки.
В общем, использование неконстантной ссылки, такой как 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
конструктор, использующий размещение нового.
Других решений пока нет …