編集者注:このコードは、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>
。