Rust 为什么借临时贷款是合法的? P>来自C++,我很惊讶这个代码在RIST:中是有效的 let x = &mut String::new(); x.push_str("Hello!"); 在C++中,你不能接受一个临时的地址,而一个临时的表达式不会出现在它的表达式中。

Rust 为什么借临时贷款是合法的? P>来自C++,我很惊讶这个代码在RIST:中是有效的 let x = &mut String::new(); x.push_str("Hello!"); 在C++中,你不能接受一个临时的地址,而一个临时的表达式不会出现在它的表达式中。,rust,temporary,Rust,Temporary,临时工在铁锈中能活多久?既然x只是借来的,那么谁是字符串的所有者呢 为什么借临时贷款是合法的 这是合法的,因为同样的原因,它在C++中是非法的。 临时工在铁锈中能活多久?既然x只是借来的,那么谁是字符串的所有者呢 : 表达式的临时作用域是 包含表达式的最小范围,适用于以下内容之一: 整个功能体 声明 主体,主体一个或一个表达式的主体 if表达式的else块 if或while表达式或匹配的条件表达式 守卫 火柴臂的表达式 函数的第二个操作数 基本上,您可以将代码视为: 让mut一个你看不见的变

临时工在铁锈中能活多久?既然
x
只是借来的,那么谁是字符串的所有者呢

为什么借临时贷款是合法的

这是合法的,因为同样的原因,它在C++中是非法的。 临时工在铁锈中能活多久?既然

x
只是借来的,那么谁是字符串的所有者呢

:

表达式的临时作用域是 包含表达式的最小范围,适用于以下内容之一:

  • 整个功能体
  • 声明
  • 主体,主体一个或一个表达式的主体
  • if
    表达式的
    else
  • if
    while
    表达式或
    匹配的条件表达式
    守卫
  • 火柴臂的表达式
  • 函数的第二个操作数
基本上,您可以将代码视为:

让mut一个你看不见的变量=String::new();
设x=&mut一个你看不见的变量;
x、 按下按钮(“你好!”);
另见:


鲁斯特的《和平号》提供了一些关于临时人本质的见解;考虑下面的简化情况:

fn main() {
    let foo = &String::new();
}
以及它产生的和平号(标准评论替换为我的):

您可以看到,“不可见”所有者在为其分配引用之前收到一个值,并且该引用在所有者之前被删除,这与预期的一样

我不确定的是,为什么会有一个看似无用的
范围2
,以及为什么所有者没有被放在任何范围内;我怀疑和平号还没有100%准备好。

来自:

暂时寿命

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

这是适用的,因为
String::new()
是一个值表达式,它位于位置表达式上下文中的
&mut
之下。现在,引用运算符只需通过这个临时内存位置,因此它成为整个右侧的值(包括
&mut

但是,当创建一个临时值表达式并将其分配到let声明中时,将使用封闭块的生存期来创建临时值表达式

因为它被分配给变量,所以它的生存期直到封闭块结束

这也回答了两者之间的区别

let a = &String::from("abcdefg"); // ok!


在第二个变体中,临时被传递到 ASScript()/Cuth>,因此它的生命周期在语句的末尾结束。

C++中,你不能接受临时的地址——我不知道C++,但这总是真的吗?Shepmaster
&x
的地址是
x
,我相信这对临时工来说永远都是无效的。我可能应该把它比作一个临时的引用,这是可能的,甚至扩展了临时的生命周期,所以总体上,行为实际上与锈迹所做的非常相似。@ SvenMarnach:你可以完全采用C++中的临时地址,<代码>结构T {t*Me(){{ } };code>将返回
T
实例的地址,无论它是否是临时的。此外,C++允许将const引用或r值引用绑定到临时变量,而引用它只不过是伪装的指针。@ MatthieuM。是的,我做的比较没有意义。我应该把它比作在C++中创建一个引用,而不是因为“语法>看起来类似”,而不是与<代码>和TEMP<代码>进行比较。@ SvenMarnach:不用担心:语法非常相似,效果是相似的(因为引用是指针),所以这看起来是一个非常自然的错误。只是Stroustrup在允许的情况下决定了一些事情,而其他的事情并不是因为直觉,他觉得这很容易出错。。。事后看来,缺乏统一性可能更令人困惑:)谢谢!这表明,Shepmaster给出的等效代码不仅仅是一个类比,更确切地说是正在发生的事情。中间表示总是倾向于包含许多看似无用的位,这些位在以后的阶段会得到优化。我还喜欢在某个随机点分配的可变空元组。@SvenMarnach如果我没有弄错的话,
\u 0
元组只是
main()
的返回值;不过,这仍然不是最有趣的信息:)。
在第二个变体中,临时变量作为_str()传递,因此它的生存期在语句末尾结束。
。现在我明白了,谢谢!,作为一个C/C++用户,这是一个双重困惑,因为这确实是一个编译器错误。请在每个
中签入您的代码,让一个
声明隐藏先前的声明。@sateesh抱歉。我没有注意使用变量的情况。现在我明白了。谢谢。@khuttun更新。谢谢!但对于这个特殊的问题,这个链接会更好吗?
let a = &String::from("abcdefg"); // ok!
let a = String::from("abcdefg").as_str(); // compile error