StorageClassという名前の文法規則と、その言語で意味的にストレージクラスであるものとの間には大きな違いがあることを指摘しておきます。文法規則は、コンパイルのセマンティックフェーズではなく、構文解析に関係しています。
まず、TDPLの第8章では、型修飾子について明示的に説明しています(Walterは型コンストラクターという用語を使用していました)。Dには3つしかありません。
const
不変
共有
これらの3つはすべて、変更するタイプの一部です。これは、などのストレージクラスには当てはまりませんref
。
inout
TDPLが「ワイルドカード修飾子シンボル」と呼ぶものであるため、実際には型修飾子またはストレージクラスではなく、型修飾子のプレースホルダーです。
ここで、ストレージクラスとは何かについて、TDPLから2つの引用をします。
各関数パラメーター(base
および上記の例)には、その型に加えて、呼び出されたときに引数が関数に渡される方法を決定するexponent
オプションのストレージクラスがあります。
(6〜7ページから)
関数への引数の受け渡しとは関係ありませんがstatic
、ここで説明するのは適切です。データref
にstatic
適用されるのはストレージクラスであり、データの保存方法に関する詳細を示すためです。
(137ページから)
また、Cのストレージクラスに関しては、オンラインで見つかったCのストレージクラスの説明でかなり使用されているようです。
ストレージクラスは、Cプログラム内の変数や関数のスコープ(可視性)と存続期間を定義します。
ストレージクラスは、変数の型には影響せず、格納方法に影響します。残念ながら、Dでストレージクラスの正確なリストを見つけることができません。また、ストレージクラスという用語は、適用されない場合でも使用されます。アクセス修飾子の型保存に適用されるほとんどすべての属性は、誰が話しているかに応じて、ストレージクラスと呼ばれるようです。ただし、疑いの余地のないストレージクラスがいくつかあります。
enum(マニフェスト定数として使用される場合)
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は、どの属性が実際に変数の型に影響を与えるかを強調するために型修飾子について大きな論点を示す傾向があるようですが、ストレージクラスという用語は、同じレベルの重要性に近いどこにも与えられておらず、最終的に使用されます厳密な定義ではなく、非公式に。