在c ++中,c-casting与类型或类型引用的区别是什么?
foo = (unsigned int) whatever;
// Is this the same as:
foo = (unsigned int&) whatever;
Run Code Online (Sandbox Code Playgroud)
不,它甚至不是一样的.
(在某些情况下,演员的确切性质取决于什么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).