2

如果我没记错的话,C-Style 转换只不过是一组有序的转换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 样式转换是什么,为什么?

4

3 回答 3

7

正确的方法是:

static_cast<NUMBERS>(a)

因为:

8) 整数、浮点或枚举类型可以转换为任何枚举类型(如果转换为枚举的基础类型的表达式的值不是目标枚举值之一,则结果未指定)

来源:http ://en.cppreference.com/w/cpp/language/static_cast

dynamic_cast使用 RTTI 进行运行时检查,因此它仅适用于具有至少一个虚拟方法的类。

reinterprest_cast旨在告诉编译器将特定的内存块视为某种不同的类型,而无需任何实际的运行时转换。

于 2012-10-19T19:40:23.213 回答
5
static_cast<NUMBERS>(a)

因为 static_cast 的规范包括:

整数或枚举类型的值可以显式转换为枚举类型。如果原始值在枚举值 (7.2) 的范围内,则该值不变。否则,结果值是未指定的(并且可能不在该范围内)。浮点类型的值也可以转换为枚举类型。结果值与将原始值转换为枚举的基础类型(4.9)相同,然后再转换为枚举类型。

static_cast 通常用于获取一种类型的值并将该值表示为另一种类型。大约有两页的规范涵盖了所有细节,但是如果您理解了这个基本概念,那么您可能会知道何时要使用 static_cast。例如,如果要将整数值从一种整数类型转换为另一种整数类型,或者如果要将浮点值转换为整数值。

dynamic_cast 用于处理动态类型,它主要只对多态、用户定义的类型有用。例如,如果引用的对象实际上是 Derived,则将 Base * 转换为 Derived *。

reinterpret_cast 通常用于在一种类型中获取值的表示,并在另一种类型中获取具有相同表示的值;即,类型双关语(尽管很多类型双关语在 C++ 中实际上是不合法的)。例如,如果您想以 char 数组的形式访问整数的存储。

const_cast 用于在类型的任何级别添加和删除 cv 限定符(const 和 volatile)。例如,int const * volatile **i; const_cast<int volatile ** const *>(i);

于 2012-10-19T19:37:51.457 回答
0

static_cast<>是要走的路:

这就是为什么

于 2012-10-19T19:39:45.070 回答