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