Rust 为什么应用于引用的运算符会强制,但显式类型的 let 却不会?

问题描述 投票:0回答:1

考虑以下代码:

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 语句。

为什么拒绝编译?

rust reference type-coercion
1个回答
0
投票

情况 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
;这样做需要复制(取消引用)或克隆。

© www.soinside.com 2019 - 2024. All rights reserved.