我想指出一個名爲StorageClass的語法規則與語言中語義上的存儲類有什麼區別。語法規則與解析有關,而不是編譯的語義階段。
首先,TDPL,第8章明確指出類型限定符(Walter使用術語類型構造函數)。目前只有其中的3 d:
常量
不變
共享
他們三個是他們修改類型的一部分。存儲類別如ref
不適用。
inout
是TDPL所稱的「通配符限定符符號」,因此它是類型限定符的佔位符,而不是真正的類型限定符或存儲類。現在
,至於什麼是存儲類或沒有,我給來自TDPL兩個引號:
每個函數參數(在上面的例子中base
和exponent
)有,除了其類型,可選存儲類決定參數在被調用時傳遞給函數的方式。
(從6頁 - 7)
雖然static
,因爲應用於數據就像ref
,static
是不相關的參數傳遞給函數,討論在這裏是合適的是存儲類,意思是關於數據如何存儲的細節的指示。
(137頁)
此外,還有在C關於存儲類此行似乎是usedquite a bit在C對存儲類的說明在網上找到:
一存儲類定義C程序中變量和/或函數的作用域(可見性)和生存時間。
存儲類對變量的類型沒有影響,它只是如何存儲的。不幸的是,我無法在D中找到存儲類的確切列表,而且人們對存儲類非常自由,甚至在不適用時也使用它。非常多任何屬性應用於訪問修飾符類型保存似乎被稱爲存儲類,這取決於誰在說話。然而,也有一些其是毫無疑問的存儲類:
枚舉(作爲清單恆定使用時)
的extern
懶惰
出
REF
範圍
靜態
lazy
,out
和ref
可用於修改功能參數並指示它們如何通過,而enum
和static
用於指示變量如何存儲(在enum
的情況下無處可用,因爲清單常量在使用它們的任何地方複製粘貼而不是實際變量)。 extern
影響鏈接。
in
是一個混合,因爲它是scope const
的同義詞,而scope
是一個存儲類,const
是一個類型限定符。
聯機文檔還提到auto
和作爲存儲類,但我不知道在什麼基礎上。 auto
就像inout
,因爲它是一個佔位符(在它的情況下是一個類型的佔位符而不是類型限定符),因此並不指示類型是如何存儲的,所以我不會認爲它是一個存儲類。不會修改變量,而是修改類。
__gshared
也可能是一個存儲類,雖然它有點好笑,因爲它或多或少的做了shared
(這是一個類型限定符),但它不是類型的一部分。
除此之外,我不知道。被列爲存儲類的事實意味着其他一些(如final
)可能是,但是(如)它們與變量如何存儲或鏈接無關。所以,我不知道他們如何被認爲是存儲類。
我會問新聞組,但看看我能否得到一個更確定的名單。
編輯:似乎在D中沒有確定的正式存儲類列表。該術語幾乎用於變量聲明上使用的任何屬性,它不影響其類型(即不是類型限定符)。似乎沃爾特和安德烈傾向於強調類型限定符來強調哪些屬性實際上會影響變量的類型,但是術語存儲類沒有被賦予任何接近相同重要級別的地方並最終被使用非正式的而不是任何嚴格的定義。
auto不是一個類型的佔位符。它只是一個沒有任何操作符的類,放在聲明前面,沒有任何其他sc或類型,所以編譯器將它識別爲聲明並推斷類型。不可變的x = 5;沒有汽車就可以工作。 – Mafi 2012-04-14 14:07:59
@Mafi,*實際*,'auto'可以被認爲是堆棧變量的存儲類,就像在C和C++中一樣。 'auto'關鍵字源於這種用法,其語義被擴展*以允許對其他存儲類的變量進行類型推斷;只有在這一點上,關鍵字才能在局部變量之外使用。然而,'auto'關鍵字在它的類型推斷語義之前是罕見的景象,並且在C中仍然罕見,因爲'auto'是局部變量的默認存儲類。它被稱爲「自動」,因爲它意味着「自動生命期」,即堆棧變量。 – 2012-04-15 04:02:13