考虑以下代码:
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 不是强制转换,而是这些运算符的定义方式。例如,
-&foo
type也是如此i32
。对于 来说也是一样的!&foo
。bar
和行上的类型注释bad
没有执行任何操作。同时,第 2 行不是允许的强制:在您链接的强制列表中没有任何地方说
&T
可以强制T
; 这样做需要复制(解除引用)或克隆。