考虑以下代码:

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
}

Playground

通读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也是如此.barbad行上的类型注释没有任何作用.

与此同时,第2行是不允许的强制:在您链接的气球列表中没有任何地方表明可以将&T强制为T;这样做需要复制(解除引用)或克隆.

Rust相关问答推荐

如何在rust中有条件地分配变量?

为什么拥有的trait对象的相等运算符移动了正确的操作数?

为什么幻影数据不能自动推断?

从Rust调用C++虚拟方法即使在成功执行之后也会引发Access违规错误

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

为什么Deref类特征不构成?

在macro_rule中拆分模块和函数名

Rust面向对象设计模式

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

Rust与_有何区别?

特征中定义的类型与一般定义的类型之间的区别

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

在 Traits 函数中设置生命周期的问题

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

如何断言代码不会在测试中编译?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

如何将 u8 切片复制到 u32 切片中?