rust - 是否可以返回在函数范围内创建的引用?

标签 rust lifetime

<分区>

我有一个相当简单的程序:

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

我明白为什么会失败。

  1. 我不知道如何返回在函数范围内创建的引用。有什么办法吗?
  2. 为什么单次返回不能省略生命周期?

编辑:我更改了标题,因为它建议返回盒装类型会有所帮助,但事实并非如此(见答案)。

最佳答案

截至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 }
}

关于rust - 是否可以返回在函数范围内创建的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550758/

相关文章:

iterator - 将迭代器映射到矩阵元素时的生命周期问题

azure - 如何修复 AzureADPreview Windows PowerShell 中的 'Policy operations on v2 application are disabled'

rust - Rust 中类似结构的重复代码删除

rust - 将闭包指定为返回类型的替代方法?

rust - mem::forget(mem::uninitialized()) 是否定义了行为?

rust - Rust的确切自动引用规则是什么?

node.js - 从 Rust 生成的 Node FFI 调用和动态库

c++ - 如何处理返回指针的生命周期?

rust - 在Rust中的元组中传递多个引用

generics - 即使 `AsRef` 存在足够长的时间,借用的值对于 `self` 结果来说也没有足够长的存在