const_cast castet mehr als nur const?

29/07/2015 - 11:03 von Heinz Saathoff | Report spam
Hallo,

ich bin zufàllig auf einen const_cast gestoßen, der mehr als nur const
entfernt. Zumindest scheint das bei Anpassung von Pointern so zu sein.
Folgender Code geht so durch den Compiler:

const unsigned char *ucp;

void Foo(char *p);

void Bar() {
int x = 0;
const int *ip = &x;
Foo(const_cast<char *>(ucp)); // (1)
Foo(const_cast<char *>(ip)); // (2)
}


Im Fall (1) wird zusàtzlich von unsigned char auf signed char
gecastet. Im Fall (2) wird ein Zeige auf int zu einem Zeiger auf char
gecastet.
Den Test hab ich mit meinem alten DigitalMars und mit dem Online
Compiler http://www.codepad.org gemacht. Beide haben das anstandslos
übersetzt.
Ist das tatsàchlich so, dass const_cast so arbeitet?


- Heinz
 

Lesen sie die antworten

#1 Daniel Krügler
29/07/2015 - 18:36 | Warnen spam
Am Mittwoch, 29. Juli 2015 18:20:04 UTC+2 schrieb Heinz Saathoff:
ich bin zufàllig auf einen const_cast gestoßen, der mehr als nur const
entfernt. Zumindest scheint das bei Anpassung von Pointern so zu sein.
Folgender Code geht so durch den Compiler:

const unsigned char *ucp;

void Foo(char *p);

void Bar() {
int x = 0;
const int *ip = &x;
Foo(const_cast<char *>(ucp)); // (1)
Foo(const_cast<char *>(ip)); // (2)
}


Im Fall (1) wird zusàtzlich von unsigned char auf signed char
gecastet. Im Fall (2) wird ein Zeige auf int zu einem Zeiger auf char
gecastet.



Weder (1) noch (2) sind gültige Aufrufausdrücke. Weder in C++03 noch in irgend einer neueren Version.

Den Test hab ich mit meinem alten DigitalMars und mit dem Online
Compiler http://www.codepad.org gemacht. Beide haben das anstandslos
übersetzt.



Ich vermute, dies basiert auf einem Missverstàndnis, wie dieser Online compiler arbeitet. Es sieht so aus, als würde bei Nicht-Wàhlen von Run Code nur die Deklarationen kompiliert (was mir merkwürdig vorkommt). Wenn du Run Code anwàhlst, gibt es folgendes Ergebnis:

http://codepad.org/IIhOBhQi

Die zweite nicht wohl-geformte Zeile 9 wird als Fehler markiert, wenn du die Zeile 8 auskommentierst.

Ist das tatsàchlich so, dass const_cast so arbeitet?



Nein.

Besten Gruß aus Bremen,

- Daniel Krügler

Ähnliche fragen