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

在Rust中可变地借用文字的语义是什么?,rust,semantics,literals,borrowing,Rust,Semantics,Literals,Borrowing,我发现它能够编译: let x = &mut 10; *x = 20; 这很令人困惑。可变地借用文字的语义是什么 我来自C++,编译器绝对不会允许我这样引用一个r:< /p> int*x=&10; int&y=10; > ,像C++一样,Rust有价值和价值的概念。引用将它们称为值表达式(右值)和位置表达式(左值)。此外,还有值上下文和位置上下文(表达式/语句中的插槽,其中分别需要值表达式或位置表达式) Rust对于在位置上下文中使用值表达式(如文字)有特殊规则(如借用运算符&)。发

我发现它能够编译:

let x = &mut 10;
*x = 20;
这很令人困惑。可变地借用文字的语义是什么

我来自C++,编译器绝对不会允许我这样引用一个r:< /p>

int*x=&10;
int&y=10;

>

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

Rust对于在位置上下文中使用值表达式(如文字)有特殊规则(如借用运算符
&
。发件人:

在大多数位置表达式上下文中使用值表达式时,将创建一个初始化为该值的临时未命名内存位置,表达式的计算结果将改为该位置[…]

因此,Rust会自动将值
10
存储在内存位置。内存位置的生存期取决于值表达式的使用方式,但在您的情况下,未命名内存位置的生存期与封闭块的生存期相同。因此,它相当于隐藏的
let
绑定:

let _compiler_generated = 10;
let x = &mut _compiler_generated;
*x = 20;
这不仅仅适用于文字:

fn get_u32() -> u32 { 3 }

let x = &mut get_u32();
*x = 20;
虽然对那些熟悉对象的生命周期的工作方式如C++语言的人感到困惑,但在一些情况下,这是一个相当有用的特性。

相关:如果对文本使用im可变引用,则该值不仅会写入堆栈插槽,还会写入静态内存。这意味着
让&'static u32=&10
有效!这已在。

@Boiethios中指定。我认为这不是重复的。绝对是相关的。但问题是不同的。有趣的是,在C中,这个<代码>包含int(空){int *p=(和){ 10 };*p=20;PrtTf(“%d”,*p);}。也见C++有时也会做类似的事情。虽然规则略有不同。@Veedrac我只能在将常量引用传递给函数时才想到特殊规则(这会使引用在函数调用期间持续)。还有更多的规则吗?
const T&x=get_value()也得到扩展。假定
const T&&x=get_value()也有效!