Just use static_cast
. The problem with C casts is the ambiguity of the operation (i.e. point (1) of Explicit type conversion).
C++ casts avoid this. Additionally C++ casts are more visible when searching for them.
Using Stroustrup's words (What good is static_cast?):
Even an innocent-looking cast can become a serious problem if, during development or maintenance, one of the types involved is changed. For example, what does this mean?:
x = (T)y;
We don't know. It depends on the type T
and the types of x and y. T
could be the name of a class, a typedef
, or maybe a template parameter. Maybe x
and y
are scalar variables and (T)
represents a value conversion. Maybe x
is of a class derived from y
's class and (T)
is a downcast. Maybe x
and y
are unrelated pointer types. Because the C-style cast (T)
can be used to express many logically different operations, the compiler has only the barest chance to catch misuses. For the same reason, a programmer may not know exactly what a cast does. This is sometimes considered an advantage by novice programmers and is a source of subtle errors when the novice guessed wrong.
The "new-style casts" were introduced to give programmers a chance to state their intentions more clearly and for the compiler to catch more errors.
[CUT]
A secondary reason for introducing the new-style cast was that C-style casts are very hard to spot in a program. For example, you can't conveniently search for casts using an ordinary editor or word processor.
[CUT]
casts really are mostly avoidable in modern C++
Also consider boost::numeric::converter
/ boost::numeric_cast
that are safer alternatives (part of Boost.NumericConversion library).
E.g.
#include <iostream>
#include <boost/numeric/conversion/cast.hpp>
int main()
{
using boost::numeric_cast;
using boost::numeric::bad_numeric_cast;
using boost::numeric::positive_overflow;
using boost::numeric::negative_overflow;
try
{
int i = 42;
short s = numeric_cast<short>(i); // This conversion succeeds (is in range)
}
catch(negative_overflow &e) { std::cout << e.what(); }
catch(positive_overflow &e) { std::cout << e.what(); }
return 0;
}
In general for both implicit conversions and explicit conversions (through static_cast
) the lack of preservation of range makes conversions between numeric types error prone.
numeric_cast
detects loss of range when a numeric type is converted and throws an exception if the range cannot be preserved.
static_cast
, the "standard" C++ way, and nothing changed from C++11 about it. – Betthelfloat f = n;
is my preference – Lightproof