2016-10-28 39 views
5

在結構中使用原始點時,Rust不允許從默認值派生。如何爲原始指針實現`Default`?

如:

#[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,所以我希望能夠避免它在某些案例。

+3

現在,我想知道,如果有人主動決定,原始指針不應該IMPL'Default'或者如果IMPL只是忘記了... –

+0

我已創建一個問題:https://github.com /防鏽琅/防鏽/問題/ 43722 – AndreyT

回答

6

Is there a way to declare Default for the raw pointer?

沒有,目前還沒有。特徵或類型需要在箱子中定義,其中trait-impl被寫入(所謂的「孤兒規則」)。

但是,您不需要爲包含指針的所有類型手動實現Default。您可以創建一個新類型,它包裝一個原始指針並執行Default。然後,您可以在所有結構中使用這種新類型,並簡單導出Default

struct ZeroedMutPtr<T>(pub *mut T); 

impl<T> Default for ZeroedMutPtr<T> { ... }