c-casting以针对c-casting键入类型的引用

cod*_*ack 1 c++ enums casting

在c ++中,c-casting与类型或类型引用的区别是什么?

foo = (unsigned int) whatever;  

// Is this the same as: 
foo = (unsigned int&) whatever;  
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

不,它甚至不是一样的.

(在某些情况下,演员的确切性质取决于什么whatever.我将假设其类型whatever与之无关unsigned int.)

C-casting到引用类型unsigned int &相当于reinterpret_cast对该类型执行a

foo = reinterpret_cast<unsigned int &>(whatever);  
Run Code Online (Sandbox Code Playgroud)

根据定义,它相当于

foo = *reinterpret_cast<unsigned int *>(&whatever);  
Run Code Online (Sandbox Code Playgroud)

whatever 在这种情况下,必须是左值.

换句话说,投射到参考只是另一种类型双关语的方法.您可以简单地重新解释whatever作为unsigned int对象占用的内存.通常情况下,行为未定义.例如,如果sizeof whatever小于大小unsigned int,重新解释也将涉及一些甚至不属于的"狂野"内存whatever.

同时,非参考C-cast只是一种价值转换,而不是内存重新解释.对于算术转换,unsigned int它等效于static_cast(但如果whatever是指针,则相当于reinterpret_cast).它读取whatever并将其转换为unsigned int根据语言转换规则(如果转换存在)型.

例如,这个

float f = 5;
unsigned int i = (unsigned int) f;
Run Code Online (Sandbox Code Playgroud)

将转换f输入unsigned int,这意味着i将获得的值5.同时,如果您的平台尺寸unsigned int和尺寸float相同,那么这个

unsigned int i = (unsigned int &) f;
Run Code Online (Sandbox Code Playgroud)

实际上会重新解释的内部对象表示float对象f与值5作为类型的对象unsigned int.结果值i通常是不可预测的.通常它甚至不会接近5(在流行的实现中,您将简单地接收原始float值的IEE754表示i).