No entiendo por qué la matriz se descompone en un puntero en una función de plantilla.por qué la matriz decae a un puntero en una función de plantilla
Si observa el siguiente código: Cuando el parámetro está forzado a ser una referencia (función f1), no decae. En la otra función f decae. ¿Por qué el tipo de T en la función f no es const char (buff &) [3] sino más bien const char * (si lo entiendo correctamente)?
#include <iostream>
template <class T>
void f(T buff) {
std::cout << "f:buff size:" << sizeof(buff) << std::endl; //prints 4
}
template <class T>
void f1(T& buff) {
std::cout << "f:buff size:" << sizeof(buff) << std::endl; //prints 3
}
int main(int argc, char *argv[]) {
const char buff[3] = {0,0,0};
std::cout << "buff size:" << sizeof(buff) << std::endl; //prints 3
f(buff);
f1(buff);
return 0;
}
Si simplemente pasó un 'en t' a 'f', luego' T' sería 'int', no' int & '. Por lo tanto, debería preguntar algo como "¿Por qué el tipo de T en la función f no es' const char [3] 'sino más bien' const char * '?" (tenga en cuenta la falta de '&' en comparación con su respuesta) –
... (continuación de mi último comentario). Lo más estúpido del lenguaje C/C++ es que si coloca 'const char [3]' en sus parámetros, el compilador lo reescribirá silenciosamente como 'const char *'. Esto no sucede con las variables locales, por ejemplo. Realmente creo que esto debería conducir a advertencias hoy en día (de los compiladores de C++ al menos) –