Javiću se još jednom, čisto da bih objasnio da nikoga nisam zezao. Ako neko smatra da ga zezam, ne mora da se nervira i odgovara ili može da mi napiše da sam budala, ne ljutim se, nema veze. U nastavku ovog posta ću pisati o tome šta me je zanimalo, a u sledećem postu kakve sam odgovore dobio i kako sam reagovao (čisto da bi oni koji ne žele da čitaju jedno od to dvoje mogli lakše da preskoče onaj deo koji ih ne zanima).
Inače,
sav kod koji ovde okačim je testiran g++ kompajlerom (gcc version 4.2.2) pod Linux sistemom. Ako se nekome rezultati ne poklope sa onim što napišem (u smislu komnpajliranja / nekompajliranja i / ili pucanja / nepucanja i / ili drugačijih rezultata) molim da napiše čime kompajlira kod. Ako neko bude želeo da odgovara,
molim da testira kod koji kači, a bilo bi lepo i da napiše čime kompajlira.
Jano je meni da neke stvari ne mogu da radim, jer me kompajler grdi. Ja svoje prktične probleme uspešno rešavam i vrlo dobro znam šta su lvrednosti, šta dvrednosti i šta su privremeni objekti.
Međutim, ono što je mene zanimalo je zašto kreatori jezika / pisci kompajlera nisu razmišljali na sledeći način: da postoji automatska konverzija iz int*& u const int*&, tako što se adresa pokazivačke promenljive baca na stek, jer konceptualno (sa stanovišta projektovanja jezika) ne bi trebalo da bude problema.
Ja se ne bih bunio da int objekat koji šaljem Peri po referenci (u stvari, šaljem pokazivač na int po referenci) bude promenjen, ali mi Pera obeća da ga neće menjati (onaj int na koji se pokazuje), ja mu kažem, sve i da ga promeni, meni to nije problem itd. Zbog čega je meni opasno da Peri dam takvu pošiljku? Sa stanovišta implementacije, samo se šible adresa pokazivača na stek i gotovo.
Kod nepokazivačkih tipova ovo baš tako i radi. Sledeći program radi ispravno
Code:
#include <iostream>
using namespace std;
void ispisi(const int &x)
{
cout << x << endl;
}
int main()
{
int a = 5;
ispisi(a);
return 0;
}
Kod pokazivačkih tipova situacija nije ista, jer const int* znači da se int na koji se pokazuje neće menjati, a da sam pokazivač može dobiti neku drugu vrednost (recimo, 0 ili da bude preusmeren na neki drugi int). No, iz sličnih razloga ne vidim smisao uvođenja zabrane zbog koje sledeći program ne može da se kompajlira
Code:
#include <iostream>
using namespace std;
void ispisi(const int *&x)
{
if (x==0)
cout << "NULL" << endl;
else
cout << *x << endl;
}
int main()
{
int *a = new int(5);
ispisi(a);
return 0;
}
p.cpp: In function ‘int main()’:
p.cpp:16: error: invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’
p.cpp:5: error: in passing argument 1 of ‘void ispisi(const int*&)’
Sa druge strane, sledeći program radi
Code:
#include <iostream>
using namespace std;
void ispisi(const int *&x)
{
if (x==0)
cout << "NULL" << endl;
else
cout << *x << endl;
}
int main()
{
int *a = new int(5);
ispisi((const int*&) a);
return 0;
}
No, posle je Branimir napisao za liniju koda koji proizvodi grešku (na mom kompajleru) da ne proizvodi grešku. Naravno, to je bila linija koda iz programa koji sam okačio, pa se podrazumevao taj kontekst.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.