Sí, es heredado de C. La función:
void foo (char a[100]);
tendrá el parámetro ajustado para ser un puntero, y por lo tanto se convierte en:
void foo (char * a);
Si desea conservar el tipo de matriz, debe pasar una referencia a la matriz:
void foo (char (&a)[100]);
C++ '03 8.3.5/3:
... El tipo de una función se determina usando las siguientes reglas. El tipo de cada parámetro se determina a partir de su propio decl-specifier-seq y declarator. Después de determinar el tipo de cada parámetro, cualquier parámetro de tipo "matriz de T" o "función que devuelve T" se ajusta para que sea "puntero a T" o "puntero a función que devuelve T", respectivamente ....
para explicar la sintaxis:
de verificación "derecha-izquierda" regla de Google; Encontré una descripción de él here.
Se aplicaría a este ejemplo aproximadamente como sigue:
void foo (char (&a)[100]);
inicio al identificador 'a'
'a' es un derecho
Mover - nos encontramos a )
, así que invertimos la dirección buscando (
. A medida que avanzamos izquierda pasamos &
'a' es una referencia
Después de la &
llegamos a la apertura (
así que invertimos de nuevo y se ve bien. Ahora vemos [100]
'a' es una referencia a un array de 100
Y que invierten el sentido de nuevo hasta llegar a char
:
'a' es una referencia a una matriz de 100 caracteres
siempre uso std :: matriz en estos casos, evita tener que lidiar con temas como este y funciona con algoritmos std demasiado estricta – paulm
Qué tipo de seguridad? ¿Quién ha prometido seguridad de tipo estricto? No existe tal cosa en C++. –
TL; DR para las siguientes respuestas: Las matrices se convierten en punteros cuando se pasan a la función, por lo que cuando se comprueba su tamaño, todo lo que se obtiene es el tamaño de un puntero. Si trabajas solo con C, todo lo que puedo sugerirte es que calcules cualquier otro parámetro que intentes sacar de la matriz. –