gpt4 book ai didi

rust - 为什么编译器假定返回的引用与结构具有相同的生命周期?

转载 作者:行者123 更新时间:2023-12-03 11:33:20 26 4
gpt4 key购买 nike

我有以下 rust 代码:

pub struct Foo {}

impl Foo {
fn bar(&self) -> &[u8] {
// obtain some pointer from FFI and return it as a slice (ignore the zeros)
unsafe { std::slice::from_raw_parts(0 as *const u8, 0) }
}
}

fn main() {
let a;
{
let b = Foo {};
a = b.bar();
}
a;
}
编译时,会产生以下错误:
error[E0597]: `b` does not live long enough
--> src/main.rs:14:13
|
14 | a = b.bar();
| ^ borrowed value does not live long enough
15 | }
| - `b` dropped here while still borrowed
16 | a;
| - borrow later used here
这是我所期望的结果;编译器不会让对某个对象的引用(在我的例子中来自 FFI)超过它的容器。但是,我很困惑为什么会这样。为什么编译器假定返回的引用应该与结构具有相同的生命周期?据它所知,返回的引用可以随时释放。

最佳答案

由于lifetime elision ,如果编译器可以弄清楚,您不必用生命周期注释每个引用。但是,您应该知道它的存在,以便您在编写时知道:

fn bar(&self) -> &[u8]
编译器将其推断为:
fn bar<'a>(&'a self) -> &'a [u8]
所以来自 b.bar() 的切片绑定(bind)到 b 的生命周期.

关于rust - 为什么编译器假定返回的引用与结构具有相同的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66610032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com