Vin*_*rta 2 c++ enums type-conversion
如果我没记错,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;
}
Run Code Online (Sandbox Code Playgroud)
一个C风格的转换会做
Do( (NUMBERS)a );
Run Code Online (Sandbox Code Playgroud)
我想知道的是,什么是正确的非C风格转换,为什么?
正确的方法是:
static_cast<NUMBERS>(a)
Run Code Online (Sandbox Code Playgroud)
因为:
8)可以将整数,浮点或枚举类型转换为任何枚举类型(如果转换为枚举的基础类型的表达式的值不是目标枚举值之一,则结果未指定)
资料来源:http://en.cppreference.com/w/cpp/language/static_cast
dynamic_cast 使用RTTI进行运行时检查,因此它仅适用于具有至少一个虚方法的类.
reinterprest_cast 旨在告诉编译器将特定的内存块视为某种不同的类型,而不进行任何实际的运行时转换.
static_cast<NUMBERS>(a)
Run Code Online (Sandbox Code Playgroud)
因为static_cast的规范包括:
可以将整数或枚举类型的值显式转换为枚举类型.如果原始值在枚举值(7.2)的范围内,则该值不变.否则,结果值未指定(可能不在该范围内).浮点类型的值也可以转换为枚举类型.结果值与将原始值转换为枚举的基础类型(4.9)以及随后的枚举类型相同.
static_cast通常用于获取一种类型的值并将该值表示为另一种类型.大约有两页规范涵盖了所有细节,但是如果你理解了这个基本思想,那么你可能知道何时想要使用static_cast.例如,如果要将积分值从一个整数类型转换为另一个整数类型,或者如果要将浮点值转换为整数值.
dynamic_cast用于处理动态类型,它主要仅对多态的用户定义类型有用.例如,如果引用的对象实际上是Derived,则将Base*转换为Derived*if.
reinterpret_cast通常用于在一种类型中获取值的表示,并获取在另一种类型中具有相同表示的值; 即,打字(即使很多类型的惩罚在C++中实际上是不合法的).例如,如果要将整数的存储作为char数组访问.
const_cast用于在类型的任何级别添加和删除cv限定符(const和volatile).例如,int const * volatile **i; const_cast<int volatile ** const *>(i);