我有一个相当简单的程序:
fn f<'a>() -> &'a i32 {
&1
}
fn main() {
println!("{}", f());
}
它不编译(省略了一些输出):
$ rustc test.rs
test.rs:2:6: 2:7 error: borrowed value does not live long enough
test.rs:2 &1
我明白为什么会失败。
- 我不知道如何返回在函数范围内创建的引用。有什么办法吗?
- 为什么单次返回不能省略生命周期?
编辑:我更改了标题,因为它建议返回盒装类型会有所帮助,但事实并非如此(见答案)。
截至Rust 1.21 ,一个名为 rvalue static promotion 的新功能意味着问题中的代码确实现在可以编译。
在这种情况下,因为 1 是常量,编译器将其提升为 static
,这意味着返回的引用具有 'static
生命周期。 de-sugared 函数看起来像这样:
fn f<'a>() -> &'a i32 {
static ONE: i32 = 1;
&ONE
}
这适用于任何编译时常量,包括结构:
struct Foo<'a> {
x: i32,
y: i32,
p: Option<&'a Foo<'a>>
}
fn default_foo<'a>() -> &'a Foo<'a> {
&Foo { x: 12, y: 90, p: None }
}
但这不会编译:
fn bad_foo<'a>(x: i32) -> &'a Foo<'a> {
/* Doesn't compile as x isn't constant! */
&Foo { x, y: 90, p: None }
}