首页 > 解决方案 > 在 c++ 中替换 c 样式强制转换 (long&)

问题描述

在源代码中,我得到了这个 c 风格的演员表:

unsigned long test = 0;
long & truc = (long&)test;

我假设&truc采用long类型的测试地址。

我如何在 C++ 中做到这一点?

谢谢!

标签: c++

解决方案


“我如何在 C++ 中做到这一点”是什么意思?你已经做到了!有用!

暂时搁置可能有问题的别名,转换为引用类型是完全有效的,并且可以满足您的期望。

更一般地说,这样的转换可用于将表达式转换为具有其基类型的表达式,而无需复制它所描述的对象:

Derived d;
Base& b = (Base&)d;

static_cast虽然习惯用语,但在这种情况下您更喜欢 a :

Derived d;
Base& b = static_cast<Base&>(d);

实际上,在 C++ 中,C 风格转换的工作方式是,在这种特殊情况下(转换为相关类型的引用),C 风格转换static_cast.

这也是一种常见的模式dynamic_cast,它适用于指针类型:

assert(dynamic_cast<T*>(ptr) != nullptr);

还有参考类型:

try {
   dynamic_cast<T&>(*ptr);
}
catch (const std::bad_cast&) {}

长话短说,转换为引用类型并没有错或奇怪。

话虽如此,我会避免有问题的转换,比如unsigned long——long这种别名在技术上可能是明确定义的,但我必须深入研究标准才能确定,我认为这足以避免它。

切换到的一个好处static_cast是,如果不允许转换您会收到通知。然后,您可以依次切换到reinterpret_cast并继续处理有问题的混叠。;)


附录

long和之间的别名unsigned long是允许的([basic.lval] 10),只要值在两者的范围内。但是,是的,最好避免。–斯奈夫特


推荐阅读