我想进入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吗?
我认为它会被强制执行
*const _,然后应用ptr-addr-cast....
首先,隐含的强制并不是随处可见,当然也不会像e as T你所注意到的那样在表达的一部分内部发生.强制发生的地方,称为胁迫地点,通常是你已经完成评估表达的地方,例如
的RHS let/ const/ static语句:
let x = foo
// ^~~
Run Code Online (Sandbox Code Playgroud)函数参数:
foo(bar)
// ^~~
Run Code Online (Sandbox Code Playgroud)返回的表达式:
fn f() -> u32 {
foo
// ^~~
}
Run Code Online (Sandbox Code Playgroud)struct/array/tuple literals:
[foo, bar, baz]
// ^~~ ^~~ ^~~
(foo, bar, baz)
// ^~~ ^~~ ^~~
Foo { field: foo }
// ^~~
Run Code Online (Sandbox Code Playgroud)块中的最后一个表达式:
{ ...; foo }
// ^~~
Run Code Online (Sandbox Code Playgroud)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.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |