Sollte ich static_cast wirklich jedes Mal verwenden, wenn ich zwischen primitiven Typen konvertieren möchte?

7

Was macht das

? %Vor%

besser als das

%Vor%

beim Umwandeln eines primitiven Datentyps in einen anderen?

Ich habe viel Legacy-Code, der in ähnlichen Situationen den zweiten Stil für das Typcasting verwendet, also ist dies auch eine Frage, ob ich den Code nicht vollständig überarbeiten darf.

    
Desmond Hume 25.07.2012, 16:17
quelle

5 Antworten

21

Zukunftssicherheit.

Sagen wir, in Zukunft mache ich das:

%Vor%

Nun beendet int i = static_cast<int>(f); das Kompilieren, aber int i = (int)f; macht reinterpret_cast .

static_cast<int> ist das ist genau das, was ich tun soll . (int) ist tu was immer du kannst, um mir einen int zu besorgen. Mit letzterem wird der Compiler nicht umgehen, um einen int -Wert zu erhalten, und das ist selten (nie?) Wünschenswert.

    
R. Martinho Fernandes 25.07.2012, 16:20
quelle
8

Das jedes einzelne Mal ist ein Hinweis darauf.

Sie sollten nicht so oft zwischen primitiven Typen konvertieren, dass jedes Mal, wenn Sie ein paar zusätzliche Zeichen eingeben, eine mühsame Aufgabe ist. Es ist wie beschweren, dass Sie jedes Mal einen Helm tragen müssen, wenn Sie eine gefährliche Tätigkeit ausüben. Wenn Sie das Tragen des Helms als störend empfinden, liegt das Problem wahrscheinlich darin, dass Sie zu oft gefährliche Aktivitäten ausführen und nicht nur die Helmpflicht.

Wie Sie Legacy-Code adressieren, können Sie diese Frage für einige Antworten (einschließlich meiner eigenen).

    
JohnMcG 25.07.2012 16:35
quelle
6

Ja, sollten Sie.

Casts sind eine Hauptquelle für Bugs. Sie sind Wege um das Typ-System, das einer der besten Bug-Catcher für Programmierer ist.

Ein static_cast ist viel sichtbarer und viel spezifischer als ein alter C-Style-Cast. Sie wollen, dass sie auffallen. Sie möchten, dass sie beim Debuggen offensichtlich sind. Sie möchten, dass der nächste Programmierer mitkommt, um zu verstehen, warum Sie es tun.

Die Tatsache, dass es schwieriger ist, static_cast<blah>(foo) einzugeben, ist auch ein Vorteil, da es Sie dazu ermutigt, nur dann zu wirken, wenn es absolut notwendig ist.

    
Adrian McCarthy 25.07.2012 16:22
quelle
2

Ein Konstruktorcast ist eine Alternative. Angenommen, es ist ein Konvertierungskonstruktor definiert. Zum Beispiel:

%Vor%

Allerdings sollten Sie static_cast und andere C ++ - Casts definitiv einem C-Style-Cast vorziehen, da diese im Grunde sagen: "Probieren Sie jeden Cast, bis etwas funktioniert", was schließlich zu einem reinterpret_cast führt und Ihnen wahrscheinlich ein falsches Verhalten verleiht .

    
AJG85 25.07.2012 16:36
quelle
1

Das Problem mit C-Style-Umwandlungen ist, dass es Ihnen erlaubt, Konvertierungen durchzuführen, die Sie nicht beabsichtigt haben.

Es ist etwas, das Sie in Zukunft tun sollten, aber ich würde nicht zurückgehen und es ändern, wenn Sie kein Problem finden.

    
Caesar 25.07.2012 16:19
quelle