作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在下面的代码中得到b
。
unsafe {
struct Test {
num: i32,
}
let a = Test { num: 0 };
let b = &mut a as isize;
}
但它会导致以下错误消息。
error: casting `&on_create::Test` as `isize` is invalid
--> main.rs:181:15
|
181 | let b = &a as isize;
|
我以为它会被强制转换为*const _
,然后应用ptr-addr-cast .我错过了什么?我应该使用 mem::transmute
吗?
最佳答案
I thought it would be coerced to
*const _
, then applied ptr-addr-cast. ...
首先,隐式强制转换不会随处发生,当然也不会像您注意到的那样出现在像 e as T
这样的表达式中。强制发生的地方,叫做coercion sites , 通常是您完成表达式评估的位置,例如
let
/const
/static
语句的 RHS:
let x = foo
// ^~~
函数参数:
foo(bar)
// ^~~
返回的表达式:
fn f() -> u32 {
foo
// ^~~
}
结构/数组/元组文字:
[foo, bar, baz]
// ^~~ ^~~ ^~~
(foo, bar, baz)
// ^~~ ^~~ ^~~
Foo { field: foo }
// ^~~
block 中的最后一个表达式:
{ ...; foo }
// ^~~
foo as isize
不在此列表中。
其次,即使到处都允许隐式强制转换,这并不意味着 Rust 应该选择强制转换为使转换有效的类型。 &mut Test
可以强制转换为 &Test
或 *mut Test
或 *const Test
或 &mut SomeTrait
等,编译器需要检查所有这些!这只有在你告诉表达式应该强制转换成什么类型时才有效:
#![feature(type_ascription)]
let b = {&a}: *const _ as isize;
// ^~ ^~~~~~~~~~
// | we explicitly make the type a const raw pointer
// | using type-ascription
// a coercion site
但这与规范解决方案&a as *const _ as isize
没有太大区别。
关于rust - 如何将结构引用转换为 isize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43418766/
我是一名优秀的程序员,十分优秀!