Nieudana próba zmiany obiektu stałego przez wskaźnik.

0

Witajcie!
Próbowałem zmienić obiekt wstały przez wskaźnik.

#include <iostream>
using namespace std;
 
int main() {
	const int stala=3;
	const int *ws=&stala; //WSKAŹNIK NA OBIEKT STAŁY
	int *w1=const_cast<int *>(ws);
	*w1=4;
	cout<<stala<<endl; //DLACZEGO TUTAJ NIE WYSWIETLA SIĘ 4 ????
	cout<<*w1; //TUTAJ WYŚWIETLA SIĘ 4
	return 0;
}

Zupełnie nie rozumiem tej rozbieżności w wynikach.

Z góry dziękuję za pomoc!

6

To co robisz to undefined behavior. Nie możesz zmieniać stałych obiektów (const_cast służy do uzyskania z powrotem mutowalnych obiektów, do których masz const wskaźnik/referencję).

Tutaj widzisz tego efekt. Kompilator ma prawo uznać, że stała, jest (duh) stała i wstawić ją bezpośrednio do wywołania funkcji (tutaj operatora <<).

0

Nie bardzo rozumiem.
Kod, który napisałem, sparafrazowałem z "Symfonii" Grębosza.

Ale...

  • w1 wskazuje na stały obiekt
  • zmieniam wartość we wskazywanym przez w1 adresie
  • wyłuskana wartość z w1 uległa zmianie
  • wartość stałej nie zmieniła się

Gdzie więc została zapamiętana zmieniona wartość? Czy na chłopski rozum wskaźnik w1 nie "przeskoczył" w inny obszar?

Jeśli jest to "oczywista oczywistość" to przepraszam za ignorancję, ale gdyby ktoś mi to rozjaśnił, będę ogromnie wdzięczny.

1

Źle rozumiesz ;​)

Nie możesz modyfikować const obiektów1. const wskaźnik/referencja to tylko uchwyt. Możesz mieć const wskaźnik na zmienną:

int a = 42;
int const* a_ptr = &a;

W takim przypadku nie możesz zmodyfikować a poprzez a_ptr, ale możesz odczytać jej wartość. const_cast pozwala w tym wypadku na modyfikację a poprzez a_ptr. Jeśli jednak a jest faktycznie stałą, taka modyfikacja jest nielegalna.

Bardziej na chłopski rozum: kompilator widząc cout << stala << endl w Twoim kodzie pomyślał:

ha! stala jest stała, więc zamiast wrzucać instrukcję czytania z pamięci, wrzucę bezpośrednio do kodu jej wartość, czyli wypluję cout << 3 << endl; - w końcu stała = 3, a ponieważ jest stała, to nigdy nie zostanie zmieniona, więc śmiało mogę podmienić!

1poza składowymi klas oznaczonymi jako mutable, ale to nie ma znaczenia w tym temacie

0

Dzięki!
Rozjaśniłeś mi ten dziwny przypadek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1