Функция не знает размер массива в вашем примере, потому что вы предприняли явные шаги для преобразования массива в тип указателя, таким образом полностью удалив параметр функции из его первоначальной природы массива. Еще раз, вы сами предприняли осознанные шаги, чтобы убедиться, что функция не знает размер массива. В этих условиях довольно странно видеть, что вы задаете вопрос о том, почему функция не знает размер массива.
Если вы хотите, чтобы функция получила свой аргумент в виде массива , вы должны передать ее в виде массива , а не просто как указатель, и соответственно объявить соответствующий параметр функции , Массивы в C ++ не могут быть переданы «по значению», что означает, что вам придется передавать его «по ссылке», как одну возможность
void func(int (&a)[100])
{
cout << sizeof a / sizeof a[0] << endl;
}