c++ - 在 c++ 中替换 c 样式强制转换 (long&)
问题描述
在源代码中,我得到了这个 c 风格的演员表:
unsigned long test = 0;
long & truc = (long&)test;
我假设&truc
采用long
类型的测试地址。
我如何在 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),只要值在两者的范围内。但是,是的,最好避免。–斯奈夫特
推荐阅读
- liquibase - Liquibase:它怎么知道数据库发生了变化(不在changelog中)?
- android - AsyncTask 没有零参数构造函数
- sql - MS访问中的更新查询非常慢
- ms-access - 包括来自 8/4 Going Forward VBA 代码的前一周数据
- phpunit - 什么会导致 Goutte 驱动程序不遵循重定向?
- delphi - 未找到 TColorButton
- java - 编写一个 Union 函数来实现 Java Sets
- vue.js - 将参数传递给Vue路由器中的元标题
- sql - 有条件地限制行结果
- android - 使用 9 补丁图像进行初始屏幕时“发现无效颜色”