You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中操作符可对引用强制转换,显式类型let语句为何不行?

Rust引用赋值与运算符行为差异解析

先看代码示例:

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
}

这两种情况的核心差异在于一元运算符会触发自动解引用,而直接赋值语句不会。

为什么-&foo和!&foo能正常编译?

Rust的一元运算符(-、!等)在处理引用类型时,会通过Deref强制转换自动解引用操作数。以-为例,当操作数是&i32时,编译器会自动将其解引用为i32,再执行负号运算;!逻辑非运算符也是同理——最终运算结果都是i32类型,自然能匹配变量的显式类型声明。

为什么let baz: i32 = &foo;会报错?

显式指定类型的let语句允许的类型强制转换是有明确范围的,比如引用之间的转换、可变引用转不可变引用,或者通过Deref将&T转为&U(当T可Deref到U时),但直接将&T转为T不在允许的强制转换列表里。

Rust不会自动为赋值语句解引用引用以得到原始值,必须显式使用*运算符完成解引用,比如写成let baz: i32 = *&foo;才能通过编译。

内容的提问来源于stack exchange,提问作者Some Name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:40:59