Nennt man sowas cast?
-
class bar { public: bar(int i){ std::cout<<"bar"<<i<<std::endl; }; }; void foo(float f) { std::cout<<"foo float"<<f<<std::endl; } void foo(bar const& b) { std::cout<<"foo bar"<<std::endl; } int main(int argc, char** argv) { int i = 0; foo(bar(i)); //Konstruktor aufruf foo(static_cast<float>(i)); //Cast foo(float(i)); //Nennt man das Cast? }
-
Siehe Code schrieb:
//... foo(float(i)); //Nennt man das Cast? //...Würde ich so nennen.
-
Um genau zu sein ist es ein sogenannter „function style cast“, der semantisch äquivalent ist mit dem C-Style Cast:
type(x); // ist dasselbe wie: (type)x;Er hat also offensichtlich alle Nachteile, die auch der normale C-Style Cast besitzt. Vermeide ihn lieber zugunsten des expliziten `static_cast`. Es gibt sogar Leute (Scott Meyers …), die dasselbe für den Konstruktoraufruf mit einem Parameter empfehlen. Scott würde also für Deinen ersten Fall ebenfalls einen expliziten Cast verwenden (was auch legal ist, denn auch hier handelt es sich trotz des Konstruktor-Aufrufs um einen Function-Style Cast):
foo(static_cast<bar>(i));
-
Konrad Rudolph schrieb:
Um genau zu sein ist es ein sogenannter „function style cast“, der semantisch äquivalent ist mit dem C-Style Cast:
type(x); // ist dasselbe wie: (type)x;Er hat also offensichtlich alle Nachteile, die auch der normale C-Style Cast besitzt. Vermeide ihn lieber zugunsten des expliziten `static_cast`. Es gibt sogar Leute (Scott Meyers …), die dasselbe für den Konstruktoraufruf mit einem Parameter empfehlen. Scott würde also für Deinen ersten Fall ebenfalls einen expliziten Cast verwenden (was auch legal ist, denn auch hier handelt es sich trotz des Konstruktor-Aufrufs um einen Function-Style Cast):
foo(static_cast<bar>(i));Man sollte evtl. hinzufügen, dass diese Casts, mit Klassen-rvalues als Ergebnistyp niemals etas anderes produzieren können, als ein static_cast es täte (weil Klassen-rvalues nicht Ergebnis eines reinterpret_cast sein können). Man gewinnt also an dieser Stelle nichts, wenn es nur darum geht, Mehrdeutigkeiten zu vermeiden. Persönlich kann ich diesem inflationären Gebrauch von static_casts auch nichts abgewinnen. Weil beide Formen äquivalent sind, halte ich es für sinnvoller, dies zu nutzen um dem Leser des Codes Bedeutungsunterschiede klar zu machen - ebenso wie man dieselbe Sache mit der natürlichen Sprache auf unterschiedliche Weise ausdrücken und aber dabei die Betonung auf unterschiedliche Aspekte setzen kann.
foo(static_cast<bar>(i)); // übergib foo ein i in der Form eines bar foo(bar(i)); // übergib foo ein bar, dessen Inhalt durch i bestimmt ist