这段代码是正确的:
fn f() {
let mut x = 11;
b(&x as *const u8 as *mut u8);
}
fn b(x: *mut u8) {}
Run Code Online (Sandbox Code Playgroud)
为什么b(&x as *const u8 as *mut u8)有效而b(&x as *mut u8)无效?编译器抱怨:
错误[E0606]:铸造
&u8作为*mut u8无效
对“为什么”这个问题的肤浅回答 是因为这些只是asRust 中的表达式规则。引自Nomicon:
强制转换不是可传递的,也就是说,即使
e as U1 as U2是有效的表达式,e as U2也不一定如此。
既没有演员也没有强制直接从&u8to *mut u8。然而,有一个指针弱化强迫从&T到*const T和铸造从一个指针到一个尺寸的类型的任何其他。两者的组合导致您的问题中的表达式。
更深层次的问题是为什么语言是这样设计的。我实际上不知道,因为做出这些决定时我不在房间里,而且我在网上找不到理由。通常,Rust 尝试非常明确地进行类型转换,以避免实际上并非有意的转换并保持规则简单。这些原则似乎也影响了这个特定的设计决策。
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |