Const corrección para punteros de matriz?

Alguien hizo un argumento diciendo que en la C moderna, siempre debemos pasar las matrices a las funciones a través de un puntero de matriz, ya que los punteros de matriz tienen una tipificación fuerte. Ejemplo:

void func (size_t n, int (*arr)[n]);
...

int array [3];
func(3, &array);

Parece que podría ser una buena idea evitar todo tipo de errores relacionados con el tipo y la matriz fuera de los límites. Pero luego se me ocurrió que no sé cómo aplicar la corrección constante a esto.

Si lo hagovoid func (size_t n, const int (*arr)[n]) entonces es constante. Pero entonces ya no puedo pasar la matriz, debido a los tipos de puntero incompatibles.int (*)[3] versusconst int (*)[3]. El calificador pertenece a los datos apuntados y no al puntero en sí.

Un reparto explícito en la persona que llama arruinaría la idea de una mayor seguridad de tipos.

¿Cómo aplico la corrección constante a los punteros de matriz pasados como parámetros? ¿Es en absoluto posible?

EDITAR

Como información, alguien dijo que la idea de pasar matrices por puntero como este probablemente se origina en MISRA C ++: 2008 5-2-12. Ver por ejemploEl estándar C ++ de alta integridad de PRQA.

Respuestas a la pregunta(3)

Su respuesta a la pregunta