SukkoPera:
@tuxduino: Se non compilasse avrei già corretto l'errore...
Naturalmente
Sottolineavo lo stupore O_o che mi prende quando un pezzo di codice mette in crisi quelle che fino a quel momento sembravano certezze ![]()
SukkoPera:
Per inciso, la tua soluzione non è detto che funzioni, perché da qualche parte potrei chiamare get_get_parameter() con un argomento che non è const, per questo ho proposto una soluzione alternativa, che fa sì che la chiamata funzioni con argomenti const e non const.
I due casi non sono simmetrici. Ciò che è proibito (tenendo sempre a mente il dubbio esposto prima) è "rilassare" i vincoli, non aumentarli. Spiego meglio:
void f1(const char* buf) { // codice... }
void f2(char* buf) { // codice... }
La dichiarazione di f1 garantisce che la memoria puntata da buf non verrà alterata. Quindi se le passi uno string literal ("CIAO") va bene, se le passi un buffer dichiarato const char*, va bene, ma se gli passi un char*... va bene uguale
perché comunque non avverranno modifiche.
Invece la dichiarazione di f2 indica che potrà esserci accesso in scrittura alla memoria puntata da buf. Quindi se hai un const char* il compilatore dà errore, perché si tratterebbe di passare un buffer dichiarato di sola lettura (const) ad un codice che dichiara che potrà modificarne i contenuti (il fatto che poi ciò avvenga realmente all'interno della funzione è irrilevante).
In soldoni la get_get_param() è di tipo f2. Se la trasformi in f1 aggiungendo const all'argomento, poi va bene in tutti i casi.
SukkoPera:
Comunque vedrò di fare chiarezza, i cast piacciono poco anche a me.
Concordo.
E aggiungo che tutto 'sto mio pippone su const/non const ha il solo scopo di discutere per approfondire, per il solo gusto di imparare qualcosa di nuovo.
![]()