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

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风格转换,为什么?

Ale*_*lex 7

正确的方法是:

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 旨在告诉编译器将特定的内存块视为某种不同的类型,而不进行任何实际的运行时转换.


bam*_*s53 5

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);