在结构中使用原始点时,Rust不允许从Default派生.
例如:
#[derive(Default)]
struct Foo {
bar: *mut Foo,
baz: usize,
}
Run Code Online (Sandbox Code Playgroud)
报告
error[E0277]: the trait bound `*mut Foo: std::default::Default` is not satisfied
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不起作用:
impl Default for *mut Foo {
fn default() -> *mut Foo {
ptr::null_mut()
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
impl doesn't use types inside crate
Run Code Online (Sandbox Code Playgroud)
有没有办法声明Default原始指针?
否则我将不得不default为任何struct包含原始指针的函数编写显式函数,在本例中为OK,但对于较大的结构,它可能很乏味,所以我希望在某些情况下能够避免它.
有没有办法为原始指针声明Default?
不,目前还没有.需要在包中编写trait-impl的特征或类型(所谓的"孤儿规则").
但是,您不需要为Default包含指针的所有类型手动实现.您可以创建一个新类型,它包装一个原始指针并执行Default.然后你可以在所有结构中使用这个新类型并简单地派生Default.
struct ZeroedMutPtr<T>(pub *mut T);
impl<T> Default for ZeroedMutPtr<T> { ... }
Run Code Online (Sandbox Code Playgroud)