【发布时间】:2015-01-14 09:18:32
【问题描述】:
编者注:此代码不再在 Rust 1.0 中编译,错误为
parameter `'a` is never used。这个错误的原因正是因为下面演示的问题,所以(更新的)解决方案仍然适用。
extern crate core;
use core::ops::{Deref, DerefMut};
struct MutPtr<'a, T> {
ptr: *mut T,
}
impl<'a, T> MutPtr<'a, T> {
fn new<'b>(value: &'b mut T) -> MutPtr<'b, T> {
MutPtr { ptr: value }
}
}
impl<'a, T> Deref for MutPtr<'a, T> {
type Target = T;
fn deref(&self) -> &T {
unsafe { &(*self.ptr) }
}
}
impl<'a, T> DerefMut for MutPtr<'a, T> {
fn deref_mut(&mut self) -> &mut T {
unsafe { &mut (*self.ptr) }
}
}
struct Bar {
v: i32,
}
fn err<'a>() -> MutPtr<'a, Bar> {
let mut b = Bar { v: 42 };
MutPtr::new(&mut b) // Shouldn't this throw an error?
}
fn main() {
let mut b = Bar { v: 42 };
let mut ptr_b = MutPtr::new(&mut b);
let mut ptr_b1 = MutPtr::new(&mut b);
ptr_b.v = 10;
println!("{}", b.v);
ptr_b1.v = 21;
println!("{}", b.v);
}
这个代码块引起了一些混乱:
fn err<'a>() -> MutPtr<'a, Bar> {
let mut b = Bar { v: 42 };
MutPtr::new(&mut b) // Shouldn't this throw an error?
}
为什么会编译?
当我打电话时
MutPtr::new(&mut b)
它不应该有b 的生命周期吗?我预计会出现编译错误,因为生命周期 'a 比 MutPtr<'b, Bar> 的生命周期长。
【问题讨论】:
-
您是否有意将值存储为
*mut T而不是&'a mut T? -
@Dogbert 是的,因为我想要在同一个范围内有多个可变指针。(仅用于实验)
标签: rust lifetime borrow-checker