为什么在 Rust 中将 const 引用直接转换为可变引用无效?

J. *_*Doe 3 rust

这段代码是正确的:

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无效

Sve*_*ach 5

对“为什么”这个问题的肤浅回答 是因为这些只是asRust 中的表达式规则。引自Nomicon

强制转换不是可传递的,也就是说,即使e as U1 as U2是有效的表达式,e as U2也不一定如此。

使用as运算符,您可以执行显式强制转换强制转换

既没有演员也没有强制直接从&u8to *mut u8。然而,有一个指针弱化强迫&T*const T铸造从一个指针到一个尺寸的类型的任何其他。两者的组合导致您的问题中的表达式。

更深层次的问题是为什么语言是这样设计的。我实际上不知道,因为做出这些决定时我不在房间里,而且我在网上找不到理由。通常,Rust 尝试非常明确地进行类型转换,以避免实际上并非有意的转换并保持规则简单。这些原则似乎也影响了这个特定的设计决策。