2016-07-06 94 views
2

在D中,如何在D中聲明非const或不可變數據的const或不可變指針?如何在D中聲明一個const指針指向非const/mutable數據?

的dlang網站上說,你不能僅僅把它聲明爲const,因爲這使得無論是指針常量,它指向的是不可修改的數據。

我讀過有關這早期的職位,認爲這是根本不可能的。如果是這樣,那麼這是語言設計中的一個大漏洞。應該可以將指針單獨聲明爲不可修改的,否則就是瘋狂。讓const從指針傳播也意味着const數據可能是一個有用的默認安全功能。

+1

這是頭常量。沃爾特相當反對,因此爲什麼它不存在於D.新聞組有他的推理。 –

+2

的可能的複製[右的方式做「常量指針到非const」在d?](http://stackoverflow.com/questions/28137190/right-way-to-do-const-pointer-to-non- const-in-d) – ruakh

回答

3

你不知道。在D中,const,immutableshared都是可傳遞的。因此,一旦該類型的外部部分爲const(或immutableshared),則整個類型爲。在一個點上,非常在D2早期,語言有兩個頭const和尾部const,但它被認爲太複雜,是值得的,並且它已被刪除(早在2.015版本IIRC)。所以,現在constimmutableshared完全傳​​遞的,它已經這樣了多年。

你可以聲明類的東西

const(int)* p; 

,這樣類型的內部分const,但沒有辦法,表明外部分const未做一切裏面const爲好。

所以,是的,你試圖做的事情在D中是不可能的,這可能不是理想的靈活性,但是頭部const也是最不有用的形式const。所以,雖然它可能是一種損失,但據我所知,它確實不是一個大問題。並允許頭部const真的複雜的事情 - 尤其是當immutableshared發揮了作用。所以,目前的系統要簡單得多,不會損失太多的能量,這可以說是一個很好的折衷。

如果你真的想要像const這樣的東西,你總是可以創建一個不允許賦值的包裝類型,但這是你將要得到的最接近的。

+0

增加:請注意,在D中很容易在[用戶代碼](https://github.com/dlang/phobos/pull/3862)中實現HeadConst, – greenify