Rust中的std::cell::Ref
struct 定义如下:
pub struct Ref<'b, T: ?Sized + 'b> {
// NB: we use a pointer instead of `&'b T` to avoid `noalias` violations, because a
// `Ref` argument doesn't hold immutability for its whole scope, only until it drops.
// `NonNull` is also covariant over `T`, just like we would have with `&T`.
value: NonNull<T>,
borrow: BorrowRef<'b>,
}
// NB
条 comments (我假设没有什么好的/讨厌的错误?)暗示以下定义将不起作用,因为它将是noalias
违规(它们是指后端的LLVM属性吗?):
pub struct Ref2<'b, T: ?Sized + 'b> {
value: &'b T,
borrow: BorrowRef<'b>,
}
我不理解这一点,因为我的印象是,非词法生存期语义在代码生成中得到了正确的保留.否则,下面的简单示例(当然可以编译)也是非法的,对吗?
struct Foo<'a> {
v: &'a i32,
}
fn foo(x: &mut i32) {
let f = Foo { v: x };
*x = 5; // value modified while the `noalias` f.v pointer is still in scope
}
谁能对内部 struct 有更多的了解,能为我解释一下吗? 我担心我在这里误解了一些关键的东西,导致我自己的不安全代码中存在潜在的问题.