到目前为止,我的印象是存储类immutable和const存储类.在最近的视频中(大约11点55分), Walter Bright表示这immutable不是一个存储类,而是一个类型构造函数.在官方文档,immutable,const,和在许多其他的关键词,被列为是存储类:
StorageClass:
abstract
auto
const
deprecated
enum
extern
final
immutable
inout
shared
nothrow
override
pure
__gshared
Property
scope
static
synchronized
Run Code Online (Sandbox Code Playgroud)
这个清单错了吗?其中一些没有意义(例如,弃用,覆盖).
我知道static并且ref是存储类,但其余的是什么?D中的哪一个关键字是类型构造函数?
Jon*_*vis 13
我想指出,名为StorageClass的语法规则与语言中的语义存储类之间存在很大差异.语法规则与解析有关,而不是编译的语义阶段.
首先,TDPL,第8章,明确是关于类型限定符(Walter使用术语类型构造函数).D中只有3个:
const
immutable
共享
所有这三个都是他们修改的类型的一部分.对于存储类,例如ref.
inout 是TDPL所谓的"通配符限定符",因此它是类型限定符的占位符,而不是真正的类型限定符或存储类.
现在,关于什么是存储类,我给出TDPL的两个引用:
除了类型之外,每个函数参数(
base以及exponent上面的示例)都有一个可选的存储类,它决定了在调用时传递给函数的参数的方式.
(来自第6 - 7页)
虽然
static不涉及向函数传递参数,这里讨论的是合适的,因为,就像ref,static适用于数据是存储类,这意味着约有关数据是如何存储在详细的指示.
(来自第137页)
另外,关于C中的存储类的这一行似乎在C中的存储类的解释中使用了 相当多的内容:
存储类定义C程序中变量和/或函数的范围(可见性)和生命周期.
存储类对变量的类型没有影响,只是它的存储方式.不幸的是,我找不到D中存储类的确切列表,人们对术语存储类非常宽松,即使它不适用也使用它.几乎所有应用于类型保存访问修饰符的属性似乎都被称为存储类,具体取决于谁在说话.但是,有一些毫无疑问的存储类:
枚举(当用作清单常量时)
extern
lazy
out
ref
scope
static
lazy,out以及ref可以用来修改函数的参数和说明他们是如何通过的,而enum和static用于指示变量是如何存储(这是无处在的情况下enum,由于清单常量是复制粘贴无处不在,他们是使用而不是实际变量).extern影响联系.
in是一个混合体,因为它是一个同义词scope const,虽然scope是一个存储类,但它const是一个类型限定符.
在线文档也引用auto和synchronized作为存储类,虽然我不知道在什么基础上.auto就像inout它是一个占位符(在它的情况下是一个类型的占位符而不是类型限定符),因此没有指出类型是如何存储的,所以我不会认为它将是一个存储类.synchronized不修改变量而是修改类.
__gshared也可能是一个存储类,虽然它有点滑稽,因为它或多或少地做了什么shared(类型限定符),但它不是类型的一部分.
除此之外,我不知道.synchronized列为存储类的事实意味着其他一些(例如final)可能是,但(例如synchronized)它们与变量的存储或链接方式无关.所以,我不知道它们如何被视为存储类.
我会问新闻组,看看我是否可以获得更明确的清单.
编辑:似乎D中没有明确的官方存储类列表.该术语几乎用于变量声明中使用的任何属性,它不影响其类型(即不是类型限定符).似乎Walter和Andrei倾向于强调类型限定符以强调哪些属性实际上影响变量的类型,但术语存储类没有给出接近相同重要性的任何地方并且最终被使用非正式而非严格的定义.