2016-08-17 4 views
8

Ich habe diesen Fall:Gießen auf die gleiche Art

using T = classA; //T could be classA and could be `classB` in other platforms. 
T a; 
auto x = static_cast<classB>(a); 

Im Fall, dass T ist classA das Casting Muss. Im Fall von T ist classB das Gießen ist überflüssig.

Wird das zweite Casting standardmäßig gelöscht (kein ausführbarer Code mehr), da es nicht notwendig ist?

+1

Basierend auf [dieser Antwort] (http://stackoverflow.com/a/26858851/391161), ist es nicht klar, was Sie mit 'droped' meinen. – merlin2011

+0

Wenn durch fallen Sie meinen, dass es keinen ausführbaren Code ergibt, als ja. Basierend auf der Antwort ** merlin ** verknüpft mit. – StoryTeller

+0

Ja genau das meinte ich. Danke –

Antwort

3

Aus dem C++ 11 Standard:

5.2.9 Statische Guss

1 Das Ergebnis des Ausdrucks static_cast<T>(v) das Ergebnis der Umwandlung der Ausdruck vT einzugeben.

Wenn der Typ von v die gleichen wie T ist, ist die Umwandlung einfach, wenn T keine Klasse. Ein anständiger Compiler sollte nicht erzeugen ausführbaren Code für solche Verwendungen von static_cast.

+7

Ich denke, das ist falsch, der 'static_cast' sollte den copy-constructor aufrufen. [Beispiel] (https://godbolt.org/g/ni7n55). siehe 5.2.9/4 (in C++ 14) –

+0

Warum wird dann in @ M.M der Kopierkonstruktor aufgerufen? – Pumkko

+0

Dies [eins] (http://gcc.godbolt.org/#compilers :! ((Compiler: g6, Optionen: '- Std% 3Dc% 2B% 2B14', Quelle: 'Struct + S% 0A% 7B% 0A +++ S (S + const +% 26) +% 7B +% 7D% 0A ++ S()% 7B% 7D% 0A% 7D% 3B% 0A% 0Aint + main()% 0A% 7B% 0A ++ S + s% 3B% 0A ++ static_cast% 3CS% 3E (%)% 3B% 0A% 7D ')), filterAsm: (colouriseAsm:! T, commentOnly:! T, Anweisungen:! T, Labels:! T) , Version: 3) – Pumkko

Verwandte Themen