c++ parameters pass-by-reference eigen eigen3

c++ - Uso correcto de la clase Eigen:: Ref<>



parameters pass-by-reference (1)

En general, usar una referencia no constante como Ref<T>& nunca es una buena idea porque esto solo funcionará si la persona que llama ya tiene un objeto Ref<T> disponible. Esto descarta 5 y 7.

Los casos 3 y 4 no tienen sentido, y no se compilarán en general.

Entonces, no hay mucha diferencia entre una const Ref<const T> y una const Ref<const T>& porque es poco probable que la función se llame con un objeto Ref<const T> , por lo que una Ref<const T> Tendrá que ser creado en la mayoría de los casos de todos modos. Sin embargo, todavía podríamos recomendar 1 sobre 2 o 6.

Entonces, en resumen, podríamos recomendar Ref<T> para una referencia de escritura, y const Ref<const T>& para una referencia de const.

La opción 6, Ref<const T> , aún puede ser interesante si desea cambiar la matriz a la que se hace referencia (no su contenido) a través de una llamada al constructor Ref usando una ubicación nueva .

Eigen ha introducido la clase Ref <> para escribir funciones con objetos Eigen como parámetros sin el uso de temporarios innecesarios, cuando no se desea escribir funciones de plantilla. Uno puede leer sobre esto here .

Al buscar en Internet, encontré varias declaraciones diferentes de parámetros usando la clase Ref <>. En la documentación de Eigen, utilizan const Eigen::Ref<const Eigen::MatrixXf>& para un parámetro de solo lectura en el primer ejemplo. En el segundo ejemplo, Eigen::Ref<Eigen::MatrixXd> se introduce para los parámetros de lectura y escritura, PERO aquí const Eigen::Ref<const Eigen::MatrixXd> se usa para los parámetros de solo lectura (sin referencia). Así que mi pregunta es:

¿Cuál es la diferencia entre las siguientes declaraciones y cuándo uso cuál? `

  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>

Para completar, enumeré todas las combinaciones posibles de uso de const y la referencia.