functionional cast versus static_cast
-
ist
type(foo)
aequivalent zu
static_cast<type>(foo)
wenn nicht, wie verhalten sich
type(foo) und (type)foo zu einander?laut comeau und gcc sind type(foo) und static_cast<type>(foo) nicht aequivalent.
deshalb wagte ich einen blick in den standard:
5.2.3 Explicit type conversion (functional notation)
sagt, dass
type(foo) das selbe macht, wie die dazu passende 'cast expression' (mit einer Referenz auf 5.4 Explicit type conversion (cast notation))nur leider werde ich daraus nicht schlau, denn ich verstehe nicht was 5.4 mir in Bezug auf functional casts sagen will...
vielen dank schonmal im voraus!
-
Ich bin mir nicht sicher. type(foo) kann ein Konstruktoraufruf sein, kannstatic_cast<type>(foo) das auch?
-
@Shade:
type(foo) ist wohl eher äquivalent zu reinterpret_cast<type>(foo). static_cast<> kann z.B. keinen long zum Pointer machen, wie es der functional cast und reinterpret_cast<> können.
type(foo) und (type)foo sind äquivalent.@Helium:
Konstruktoraufruf? Oder meinst du eine user defined conversion. Die können beide.Stefan.
-
type(foo) ist sogar noch stärker als reinterpret_cast, da es äquivalent zu den normalen C-Casts ist
int main() { const char *str="hallo"; char *a=(char*)str; //geht char *b=(char*)(str); //geht char *c=static_cast<char*>(str); //Fehler char *d=reinterpret_cast<char*>(str); //Fehler }
-
danke jungs, das ist balsam auf meiner seele!
-
Original erstellt von kingruedi:
type(foo) ist sogar noch stärker als reinterpret_cast, da es äquivalent zu den normalen C-Casts istich fürchte, ihr wollt mich verkohlen.
nee, 5.2.3.1 will mich ärgern. der sagt, der functional cast sei äquivalent zum cast in 5.4.
also doch die ganzen functional casts weg und immer das lange static_cast schreiben.[ Dieser Beitrag wurde am 29.06.2003 um 21:53 Uhr von volkard editiert. ]
-
@kingruedi: Wo in deinem Code ist denn nun der functional Cast? ich findeden nicht. da ist nur ein C-Cast, bei dem zusätzlich das Objekt in klammern gesetzt wurde, was natürlich blödsinn ist.
-
mach's halt verkehrt rum:
int main () { const int *i; long a = (long) i; long b = long (i); long c = reinterpret_cast<long> (i); long d = static_cast<long> (i); }