2016-07-06 6 views
2

Dでは、Dのconst/immableポインタ以外のポインタへのポインタを宣言するにはどうすればよいですか?constポインタをDのconst/mutable以外のデータに宣言するにはどうすればよいですか?

dlangのWebサイトでは、ポインタconstとそれが指しているデータの両方が変更不可能なので、constとして宣言するだけでは不十分だと言います。

私はこれに関連するこれまでの記事を読んだだけでは不可能だということを示唆しています。もしそうなら、それは言語デザインの大きな穴です。ポインタを変更不可能なものとして宣言することは可能でなければなりません。さもなければそれは狂気です。 constをポインタから伝播させてconstデータを暗示することは、おそらく有用なデフォルトの安全機能です。

+1

これはヘッド定数です。 Walterはそれに反して、それがなぜDに存在しないのかというと、それに反しています。ニュースグループは彼の推論を持っています。 –

+2

[正しい方法でDの "constポインタを非const"にする]の可能な複製?](http://stackoverflow.com/questions/28137190/right-way-to-do-const-pointer-to-non- const-in-d) – ruakh

答えて

3

あなたはそうではありません。 Dでは、const,immutableおよびsharedはすべて推移的である。したがって、型の外側部分がconst(またはimmutableまたはshared)になると、全体の型はです。ある時点で、は非常にで、Dとtail constの両方の言語を持っていましたが、それは価値があるほど複雑すぎると考えられ、削除されました(バージョン2.015 IIRCに戻っています)。だから、今度はconstimmutable、そしてsharedは完全に推移的であり、それは何年もの間その方法でした。

タイプの内側部分がconstですが、外側の部分は同様にそれconst内部のすべてを行うことなくconstであることを示す方法がないように、あなたは

const(int)* p; 

ようなものを宣言することができます。

だから、あなたがやろうとしていることは、Dでは不可能です。これは理想的ではないかもしれませんが、constの頭はconstという最も有用な形です。だから、それは損失であるかもしれないが、私が知る限り、それは本当に大きなものではない。そして、ヘッドを許可するconst本当には、特にimmutablesharedが出現したときに複雑になる。したがって、現在のシステムは、多くの電力を失うことなくずっと簡単であり、おそらく非常に良いトレードオフになります。

もしあなたが本当に頭部constのようなものを必要としていたなら、いつでも割り当てを許可しないラッパータイプを作成することができますが、それはあなたが得ようとする最も近いものです。

+0

追加:Dでは、[ユーザーコード](https://github.com/dlang/phobos/pull/3862)内にHeadConstを実装するのは簡単だということに注意してください。 – greenify

関連する問題