Const правильность для указателей массива?

Кто-то привел аргумент, сказав, что в современном C мы всегда должны передавать массивы в функции через указатель массива, поскольку указатели массива имеют строгую типизацию. Пример:

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

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

Это звучало так, как будто это может быть хорошей идеей для предотвращения всевозможных ошибок, связанных с типами и массивами. Но потом мне пришло в голову, я не знаю, как применить к этому константность.

Если я сделаюvoid func (size_t n, const int (*arr)[n]) тогда это правильно. Но тогда я больше не могу передать массив из-за несовместимых типов указателей.int (*)[3] противconst int (*)[3], Квалификатор относится к указанным данным, а не к самому указателю.

Явное приведение в вызывающей стороне разрушило бы всю идею повышенной безопасности типов.

Как применить константную корректность к указателям массива, переданным в качестве параметров? Это вообще возможно?

РЕДАКТИРОВАТЬ

Точно так же, как информация, кто-то сказал, что идея передачи массивов указателем, подобным этому, вероятно, возникла из MISRA C ++: 2008 5-2-12. Смотри напримерPRQA высокий стандарт C ++.

Ответы на вопрос(3)

Ваш ответ на вопрос