在Rust中可变借用文字的语义是什么?

abc*_*987 1 literals rust semantics borrowing

我发现这可以编译:

let x = &mut 10;
*x = 20;
Run Code Online (Sandbox Code Playgroud)

这非常令人困惑。可变借用文字的语义是什么?

我来自C ++,在编译器中绝对不允许我这样引用右值:

let x = &mut 10;
*x = 20;
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 5

像C ++一样,Rust具有右值和左值的概念。该引用将它们称为值表达式(rvalue)和位置表达式(lvalue)。此外,还有值上下文位置上下文(在表达式/语句内部的槽,分别需要值表达式或位置表达式)。

对于在场所上下文中使用值表达式(如文字)(如借位运算符&)的情况,Rust有特殊的规则。从参考

在大多数位置表达式上下文中使用值表达式时,会创建一个临时的未命名存储位置,并初始化为该值,然后表达式求值到该位置。

因此,Rust自动将您的值存储10在存储位置中。的存储器位置的寿命取决于变化如何值表达式被使用,但在你的情况下,未命名的存储单元具有相同的寿命作为封闭块。因此,它等效于隐藏let绑定:

let _compiler_generated = 10;
let x = &mut _compiler_generated;
*x = 20;
Run Code Online (Sandbox Code Playgroud)

这不仅适用于文字:

fn get_u32() -> u32 { 3 }

let x = &mut get_u32();
*x = 20;
Run Code Online (Sandbox Code Playgroud)

虽然让熟悉对象的生存期的人(如C ++)会感到困惑,但这在某些情况下是一个非常有用的功能。


相关新闻:如果您使用的IM可变引用文字,数值不只是写一个栈槽,但到静态存储器。意思let _: &'static u32 = &10是有效的!这已在RC 1414中指定。


归档时间:

查看次数:

209 次

最近记录:

7 年,6 月 前