13

今までは、immutableやのようなものconstはストレージ クラスであるという印象を受けていました。最近のビデオ (11:55 あたり) で、 Walter Bright は、immutableこれはストレージ クラスではなく、型コンストラクターであると述べています。公式ドキュメントでは、、、、および他の多くのキーワードの中で、ストレージ クラスとしてリストされていますimmutableconst

StorageClass:
abstract
auto
const
deprecated
enum
extern
final
immutable
inout
shared
nothrow
override
pure
__gshared
Property
scope
static
synchronized

このリストは間違っていますか?意味をなさないものもあります (非推奨、オーバーライドなど)。

私はストレージクラスを知っstaticrefいますが、残りは何ですか? D のキーワードのうち、型コンストラクターはどれですか?

4

1 に答える 1

13

StorageClassという名前の文法規則と、その言語で意味的にストレージクラスであるものとの間には大きな違いがあることを指摘しておきます。文法規則は、コンパイルのセマンティックフェーズではなく、構文解析に関係しています。

まず、TDPLの第8章では、型修飾子について明示的に説明しています(Walterは型コンストラクターという用語を使用していました)。Dには3つしかありません。

const
不変
共有

これらの3つはすべて、変更するタイプの一部です。これは、などのストレージクラスには当てはまりませんref

inoutTDPLが「ワイルドカード修飾子シンボル」と呼ぶものであるため、実際には型修飾子またはストレージクラスではなく、型修飾子のプレースホルダーです。

ここで、ストレージクラスとは何かについて、TDPLから2つの引用をします。

各関数パラメーター(baseおよび上記の例)には、その型に加えて、呼び出されたときに引数が関数に渡される方法を決定するexponentオプションのストレージクラスがあります。

(6〜7ページから)

関数への引数の受け渡しとは関係ありませんがstatic、ここで説明するのは適切です。データrefstatic適用されるのはストレージクラスであり、データの保存方法に関する詳細を示すためです。

(137ページから)

また、Cのストレージクラスに関しては、オンラインで見つかったCのストレージクラスの説明でかなり使用されているようです。

ストレージクラスは、Cプログラム内の変数や関数のスコープ(可視性)と存続期間を定義します。

ストレージクラスは、変数の型には影響せず、格納方法に影響します。残念ながら、Dでストレージクラスの正確なリストを見つけることができません。また、ストレージクラスという用語は、適用されない場合でも使用されます。アクセス修飾子の型保存に適用されるほとんどすべての属性は、誰が話しているかに応じて、ストレージクラスと呼ばれるようです。ただし、疑いの余地のないストレージクラスがいくつかあります。

enum(マニフェスト定数として使用される場合)
extern
lazy
out
ref
scope
static

lazy、、、outおよびrefは関数パラメーターを変更してそれらがどのように渡されるかを示すために使用できますが、enumおよびstaticは変数がどのように格納されるかを示すために使用されます(enumマニフェスト定数はそれらが存在するすべての場所にコピー貼り付けされるため、の場合はどこにもありません)実際の変数ではなく使用されます)。externリンケージに影響します。

inはハイブリッドです。これは、の同義語であり、ストレージクラスであるscope const一方で、型修飾子です。scopeconst

オンラインドキュメントでは、ストレージクラスについても言及しautosynchronizedいますが、どのような根拠があるのか​​はわかりません。autoinoutプレースホルダー(この場合は型修飾子ではなく型のプレースホルダー)であるという点で似ているため、型がどのように格納されるかについては何も示さないため、ストレージクラスになるとは思いませんでした。synchronized変数ではなくクラスを変更します。

__gsharedおそらくストレージクラスでもありますが、少しおかしいですが、多かれ少なかれshared(型修飾子)が行うことを実行しますが、型の一部ではありません。

それを超えて、私は知りません。ストレージクラスとしてリストされているという事実synchronizedは、他のいくつか(などfinal)がそうである可能性があることを意味しますが、(のようにsynchronized)変数がどのように格納またはリンクされるかとは関係ありません。したがって、それらをストレージクラスと見なす方法がわかりません。

ただし、ニュースグループで質問し、より明確なリストを取得できるかどうかを確認します。

編集:Dには、ストレージクラスの明確な公式リストがないようです。この用語は、変数宣言で使用される、その型に影響を与えない(つまり、型修飾子ではない)ほとんどすべての属性に使用されます。WalterとAndreiは、どの属性が実際に変数の型に影響を与えるかを強調するために型修飾子について大きな論点を示す傾向があるようですが、ストレージクラスという用語は、同じレベルの重要性に近いどこにも与えられておらず、最終的に使用されます厳密な定義ではなく、非公式に。

于 2012-04-14T04:29:11.710 に答える