如何将结构引用转换为isize?

jei*_*iea 4 rust

我想进入b以下代码.

unsafe {
    struct Test {
        num: i32,
    }
    let a = Test { num: 0 };
    let b = &mut a as isize;
}
Run Code Online (Sandbox Code Playgroud)

但它会导致以下错误消息.

error: casting `&on_create::Test` as `isize` is invalid
   --> main.rs:181:15
    |
181 |       let b = &a as isize;
    |    
Run Code Online (Sandbox Code Playgroud)

我认为它会被强制执行*const _,然后应用ptr-addr-cast.我错过了什么?我应该用mem::transmute吗?

ken*_*ytm 5

我认为它会被强制执行*const _,然后应用ptr-addr-cast....

首先,隐含的强制并不是随处可见,当然也不会像e as T你所注意到的那样在表达的一部分内部发生.强制发生的地方,称为胁迫地点,通常是你已经完成评估表达的地方,例如

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
Run Code Online (Sandbox Code Playgroud)

但这与规范解决方案没有多大区别&a as *const _ as isize.