Luk*_*odt 6 rvalue lvalue language-lawyer rust
该防锈参考说:
赋值或复合赋值表达式的左操作数是左值上下文,一元借用的单个操作数也是如此.
[...]
在左值上下文中使用右值时,会创建并使用临时的未命名左值.
这种左值促销显然适用于借款:
let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created
Run Code Online (Sandbox Code Playgroud)
但它似乎不适用于任务(虽然引用说的是所有左值上下文,而不仅仅是借用):
27 = 28; // error[E0070]: invalid left-hand side expression
Run Code Online (Sandbox Code Playgroud)
E0070的错误描述未提及此右值促销.这是参考文献中的错误还是确实有某种方法可以通过赋值或复合赋值表达式触发rvalue促销?
还有第三种左值上下文,参考描述也不正确.只要存在带有a的模式,ref绑定到该模式的左值就是左值上下文.事实证明,促销适用于这种情况:
let ref x = 3; // works
Run Code Online (Sandbox Code Playgroud)
显然,促销只对(复合)作业不起作用?
自发布此问题以来,参考文献已更新。现在它说在赋值期间不会发生右值到左值的提升,因此这显然是旧参考中的错误。
如果将 & 或 &mut 运算符应用于右值,则会创建一个临时值
ref尽管我没有看到明确提及,但这可能也适用于绑定。
任务:
左侧操作数必须是左值:使用右值会导致编译器错误,而不是将其提升为临时值。