在枚举上使用的正确演员是什么?

时间:2012-10-19 19:36:37

标签: 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;
}

C风格转换会

Do( (NUMBERS)a );

我想知道的是,为什么要进行正确的非C风格转换,为什么?

3 个答案:

答案 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<>是要走的路:

Here's why