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
相关产品推荐
相关产品推荐

