在C++中替换C风格的转换(long&)

3
在源代码中,我得到了这个C风格的转换:
unsigned long test = 0;
long & truc = (long&)test;

我猜测&truc使用long类型的地址传递test参数。
在C++中,我该如何做到这一点?
谢谢!

使用 std::addressof - rak007
1
(long &)test 获取一个引用到 long 类型的变量,该引用指向 test。它不会计算地址。虽然它使用类似于 C 的“强制转换”语法,但它不是 C 风格的强制转换,因为 C 不支持引用类型。在 C 中,您的代码将无法编译。 - Peter
reinterpret_cast<long&>(test); - Jarod42
1
@rak007,OP的代码中没有地址,他们的假设是错误的。 - 463035818_is_not_a_number
5
@Peter--这不是C语言中的有效转换,但它确实是一种“C风格的转换”。该术语指的是语法,并将此代码与四个C++风格的转换(static_cast、const_cast、dynamic_cast和reinterpret_cast)区分开来。 - Pete Becker
显示剩余3条评论
1个回答

2
你是什么意思说“如何在C++中做到这一点”?你已经做到了!它有效! 暂且不论可能存在的别名问题,将类型转换为引用类型是完全有效的,并且会按照你的期望进行操作。
更一般地说,这样的转换可以用来将一个表达式转换为其基础类型的表达式,而不需要复制所描述的对象。
Derived d;
Base& b = (Base&)d;

尽管在这种情况下,为了符合惯用语法,你可能更喜欢使用 static_cast
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&) {}

长话短说,将强制类型转换为引用类型没有任何问题或奇怪的地方。
话虽如此,我会避免可疑的转换,比如将无符号长整型转换为长整型 - 这种别名可能在技术上是明确定义的,但我必须深入标准才能确定,而这就足以让我避免它。
使用static_cast的好处之一是,如果转换不被允许,你会得到通知。然后你可以转而使用reinterpret_cast并继续使用你的可疑别名。 ;)
补充:

在符合两者范围的情况下,longunsigned long 之间的别名是允许的([basic.lval] 10)。但最好还是避免使用。-Sneftel


只要值不太长,适用于 long 或者如果你使用的是 unsigned long,则适用于 unsigned long - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接