wania się do obiektów modyfikowalnych za pośrednictwem wskazników na const jest
dość częsta:
void aFunc( const T *arg1, const T &arg2 );
// &
T *a = new T;
T b;
aFunc( a, b );
Przy wywołaniu aFunc następuje inicjalizacja arg1 adresem a i arg2 adresem b. Nie
sposób jednak powiedzieć, czy a faktycznie wskazuje obiekt niemodyfikowalny, albo
czy b jest const; zakładamy jedynie, że tak będą traktowane w obrębie funkcji aFunc.
To bardzo użyteczne.
Konwersja odwrotna, czyli ze wskaznika na obiekt niemodyfikowalny do postaci
wskaznika na obiekt modyfikowalny nie jest dozwolona, bo byłaby niebezpieczna
(patrz rysunek 7.2).
Rysunek 7.2.
Wskaznik na obiekt
bez const nie może
odnosić się do
obiektu const
Zagadnienie 7. Wskazniki const i wskazniki na const 23
W takim układzie pct może faktycznie wskazywać obiekt niemodyfikowalny, zdefi-
niowany z kwalifikatorem const. Gdybyśmy ten wskaznik chcieli skonwertować do
postaci wskaznika na obiekt modyfikowalny, umożliwilibyśmy potencjalnie zmianę
wartości acT za pośrednictwem pt:
const T acT;
pct = &act;
pt = pct; // błąd, na szczęście&
*pt = aT; // próba zmiany obiektu const!
Standard C++ mówi, że takie przypisanie będzie dawało niezdefiniowane rezultaty;
nie wiadomo więc dokładnie, co się stanie, ale zapewne nic dobrego. Oczywiście mo-
żemy wykonać konwersję uciekając się do jawnego rzutowania:
pt = const_cast(pct); // odradzane, choć to nie błąd
*pt = aT; // próba zmiany obiektu const!
Jednak jeśli pt będzie odnosić się do obiektu, który (jak acT) został zadeklarowany
jako niemodyfikowalny (const), efekt przypisania wciąż będzie niezdefiniowany (zo-
bacz Nowe operatory rzutowania [9, 43]). [ Pobierz całość w formacie PDF ]