Cuando una función tiene un parámetro de matriz de tamaño específico, ¿por qué se reemplaza con un puntero?

Dado el siguiente programa,

#include <iostream>

using namespace std;

void foo( char a[100] )
{
    cout << "foo() " << sizeof( a ) << endl;
}

int main()
{
    char bar[100] = { 0 };
    cout << "main() " << sizeof( bar ) << endl;
    foo( bar );
    return 0;
}

salidas

main() 100
foo() 4
¿Por qué se pasa la matriz como un puntero al primer elemento?¿Es una herencia de C?¿Qué dice la norma?¿Por qué se elimina la estricta seguridad de tipos de C ++?

Respuestas a la pregunta(3)

Su respuesta a la pregunta