Dato il seguente codice C++ che ho trovato in rete, ho dubbi nell'interpretarlo:
void fun(char *s); // non altera la stringa
int main() {
char const hello[] = “ciao“;
fun(hello) // errore
// cannot convert parameter 1 from 'const char [5]' to 'char *‘
fun(const_cast<char *>(hello)); // OK
return 0; }
Se ben capisco la dichiarazione
char const hello[] = “ciao“ o meglio la sua definizione crea un puntatore
hello costante, la cui area di memoria viene riservata alla stringa
ciao.
Se non capisco male il nome di un array è sempre dichiarato come puntatore costante quindi non è necessario esplicitarlo con
char const hello[] o sbaglio? Primo dubbio.
Detto questo perchè il compilatore restituisce errore quando chiamo
fun(hello)?
Durante il passaggio del parametro attuale 'hello' dovrei far altro che copiare l'indirizzo di memoria contenuto in
hello nel puntatore
s, non sto cambiando il valore di
p. Giusto? Perchè il compilatore da errore ?Questo è il secondo dubbio
Per la seconda domanda provo a rispondermi da solo:
non c'e' coerenza tra tipo argomento attuale e formale, il primo è un puntatore costante a char mentre il secondo è soltanto un puntatore a char, provo a lanciarmi e affermo che il compilatore non avrebbe restituito errori se avessi avuto una situazione inversa cioè se il const fosse stato presente nel parametro formale. Corretto?