考虑以下代码:
fn main() {
let foo = 1;
let bar: i32 = -&foo; //ok, -1
let baz: i32 = &foo; //error, expected `i32`, found `&{integer}`
let bad: i32 = !&foo; //ok, -2
}
阅读Rust Reference我发现
可能的强制位点有:
- 给出显式类型的let语句。
[...]
- 函数调用的参数
所以
let baz: i32 = &foo;
也应该可以工作,因为它是一个给定显式类型的 let 语句。
为什么拒绝编译?
情况 1 和 3 不是强制转换,而是这些运算符的定义方式。例如,
// https://doc.rust-lang.org/std/primitive.i32.html#impl-Neg-for-%26i32
impl Neg for &i32
type Output = <i32 as Neg>::Output // this is i32
因此
-&foo
具有类型 i32
。 !&foo
也是一样。
同时,第 2 行不是允许的强制转换:您链接的强制转换列表中没有任何地方表明可以将
&T
强制转换为 T
;这样做需要复制(取消引用)或克隆。