gpt4 book ai didi

rust - 在 Rust 的生命周期分析期间, `&mut []` 的生命周期是否经过特殊处理?

转载 作者:行者123 更新时间:2023-12-03 11:23:45 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why is it possible to return a mutable reference to a literal from a function?

(1 个回答)


去年关闭。




下面的示例代码有些精心设计,但说明了我的主要关注点。代码编译完美。

struct SliceWrapper<'a>(&'a mut[i32]);

impl<'a> SliceWrapper<'a> {
fn clear(&mut self) {
self.0 = &mut [];
}
}

fn main() {
let slice = &mut [1, 2, 3];
let mut wrapper = SliceWrapper(slice);
wrapper.clear();
}

线路 self.0 = &mut [];可以工作,但如果我们查看它们的生命周期就会很奇怪:对局部变量的引用被分配给 self.0 ,它存在于方法调用之外 clear() .

更令人困惑的是,如果我将该行更改为 self.0 = &mut [0]; ,然后编译器会向我抛出一个错误:创建一个临时文件,该临时文件在仍在使用时被释放。

所以我猜 Rust 编译器会处理 &mut [] 的生命周期不同。真的吗? &mut [] 的精确生命周期规则是什么? ?

最佳答案

空数组确实是编译器的特殊情况。

This answer描述了具有对 constexpr 值的共享引用的类似但不同的情况。对于这种情况,有 an RFC使这个 constexpt 值“提升为静态”,即分配在静态内存中而不是堆栈中,以便它们将存在于它们定义的函数之外。

并且,在这个 RFC 中,我们有以下声明:

the compiler already special cases a small subset of rvalue const expressions to have static lifetime - namely the empty array expression:

let x: &'static [u8] = &[];


至于可变的 - 或者,这里更相关, exclusive, or unique ,引用文献,RFC 声明如下:

It would be possible to extend support to &'static mut references, as long as there is the additional constraint that the referenced type is zero sized.
...
The zero-sized restriction is there because aliasing mutable references are only safe for zero sized types (since you never dereference the pointer for them).



这部分似乎没有实现,因为这段代码是无效的:
fn main() {
let _: &'static mut [()] = &mut [()]; // fail, reference to local
}

虽然 [(); 1]是 ZST,可以通过 std::mem::size_of 查询.

关于rust - 在 Rust 的生命周期分析期间, `&mut []` 的生命周期是否经过特殊处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60409710/

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