字符串文字的生命周期和生命周期不变性

问题描述 投票:0回答:1

我有以下代码:

fn foo<'a>(s1: &mut &'a str, s2: &'a str) {
   *s1 = s2
}

let mut x: &'static str = "Hello";
let y = String::from("World");

foo(&mut x, &y);

最后一行代码有编译器错误:

error[E0597]: y does not live long enough

据我了解,发生这种情况是因为函数签名中的两个参数引用都指定了相同的生命周期,并且编译器自动将第二个参数引用的生命周期解释为

'static
,但其引用的实际生命周期不是静态的。

此外,据我所知,字符串文字默认具有

'static
生命周期,对我来说,这意味着我是否为字符串文字指定显式
&'static str
类型并不重要。

但是,在我的示例中,如果我删除

&'static str
的显式类型 (
x
),则此代码将可以正常编译。

rust borrow-checker lifetime-scoping reference-lifetimes
1个回答
0
投票

您声明 “另外,据我所知,字符串文字默认具有

'static
生命周期,对我来说,这意味着我是否为字符串文字指定显式
&'static str
类型并不重要.”
但是有一个微妙的区别。

当您指定

x
的类型及其生命周期时,编译器无法为字符串引用选择任何其他生命周期,当您不指定时,编译器可以自由选择任何比静态短的生命周期,它可以缩短生命周期在
x
中使代码编译。

© www.soinside.com 2019 - 2024. All rights reserved.