如果我没记错,C风格转换仅仅是一组有序的转化static_cast, dynamic_cast, reinterpret_cast, static_cast...
,
考虑:
enum NUMBERS
{
NUMBER_ONE,
NUMBER_TWO
};
void Do( NUMBERS a )
{
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int a = 1;
Do( a ); //C2664
return 0;
}
C风格转换会
Do( (NUMBERS)a );
我想知道的是,为什么要进行正确的非C风格转换,为什么?
答案 0 :(得分:7)
正确的方法是:
static_cast<NUMBERS>(a)
由于:
8)可以将整数,浮点或枚举类型转换为 任何枚举类型(如果值为,则结果未指定 表达式,转换为枚举的基础类型,不是一个 目标枚举值)
来源:http://en.cppreference.com/w/cpp/language/static_cast
dynamic_cast
使用RTTI执行运行时检查,因此它仅适用于具有至少一个虚方法的类。
reinterprest_cast
旨在告诉编译器将特定的内存块视为某种不同的类型,而不进行任何实际的运行时转换。
答案 1 :(得分:5)
static_cast<NUMBERS>(a)
因为static_cast的规范包括:
可以将积分或枚举类型的值显式转换为 枚举类型。如果原始值为,则该值不变 在枚举值范围内(7.2)。否则, 结果值未指定(可能不在该范围内)。一个 浮点类型的值也可以转换为枚举 类型。结果值与转换原始值相同 到枚举的基础类型(4.9),然后到 枚举类型。
static_cast通常用于获取一种类型的值,并将该值表示为另一种类型。大约有两页规范涵盖了所有细节,但是如果你理解了这个基本思想,那么你可能知道何时想要使用static_cast。例如,如果要将积分值从一个整数类型转换为另一个整数类型,或者如果要将浮点值转换为整数值。
dynamic_cast用于处理动态类型,它主要仅对多态的用户定义类型有用。例如,将Base *转换为Derived * iff引用的对象实际上是Derived。
reinterpret_cast通常用于获取一种类型的值的表示,并获取在另一种类型中具有相同表示的值;即,打字(即使很多类型的惩罚在C ++中实际上是不合法的)。例如,如果要将整数存储作为char数组访问。
const_cast用于在类型的任何级别添加和删除cv限定符(const和volatile)。例如,int const * volatile **i; const_cast<int volatile ** const *>(i);
答案 2 :(得分:0)
static_cast<>
是要走的路: