このトピックに関する最近のスレッドの基本的な結論をここの D ニュースグループに投稿するのが適切だと思います。そうすれば、そのリストを追跡していない人でも適切な回答を得ることができます。
D の const は論理 const ではありません。これは推移的であり、完全に const です。この言語は、論理定数を技術的にサポートしていません。この言語は、const オブジェクトを変更する方法を定義していません。
実際、C++ には論理定数もありません。const ネスを使用mutable
してキャストすることで、const を完全に回避できます。技術的に言えば、const は、const 変数で非 const 関数を呼び出していないことを除いて、実際には何も保証しません。const 関数が実際には const であり、変数を台無しにしないという事実は、慣習によって完全にまとめられています。現在、ほとんどのプログラマーは const ネスを左と右にキャストしてすべてを変更可能にすることはありません。したがって、実際には非常に便利ですが、完全に回避できるだけでなく、言語は特にそうするための定義された手段を提供します。 . C++mutable
およびキャスト アウェイ const では、言語によって明確に定義され、サポートされています。
Dはそれをしません。D の const は実際には const です。変数の const をキャストしてから変更することは未定義です。ミュータブルはありません。D の const には本当の保証があります (何かの const をキャスト アウェイしてから変更するなど、未定義のことをしない限り)。これは重要です。なぜなら、D に対するコンパイラの保証が C++ に対するコンパイラの保証よりもはるかに強力だからだけでなく、不変変数はできないからです。形や形を変えることはできません。それらは読み取り専用メモリにある可能性があり、不変性を捨ててそのような変数を変更しようとすると、どんな恐ろしいことが起こるか誰にもわかりません (segfault は、発生する可能性のある最も良いことでしょう)。また、const 変数は実際には不変データを参照する可能性があるため、const をキャストして変数を変更したり、const 変数を何らかの方法で変更できるようにすることは、控えめに言っても悪いことです。したがって、言語はそれを許可しません。
さて、BCS が指摘しているように、D は実用的な言語です。const をキャストすることができ、その時点で変数を変更できます。したがって、たとえば、const 関数の戻り値をキャッシュするために使用される変数 (オブジェクトの状態が変化した場合、おそらくそのキャッシュが無効になる) を使用し、const をキャストして変更することができます。問題の変数が実際に不変でない限り、それは機能します。ただし、これは未定義の動作です。それをしたら、あなたは自分自身です。型システムとコンパイラの保証をバイパスしています。あなたは、不変オブジェクトでそれを行わないようにするか、コンパイラが通常保証するものを台無しにしないようにする責任があります。したがって、必要な場合はそうすることはできますが、ワイルド ウェストに足を踏み入れているのです。必要でないものを変異させないようにするのはあなた次第です。
変数が実際に不変データを参照しない限り、const のキャスト アウェイが機能することを考えると、基本的に C++ でMutable
得られるものを取得するためのテンプレートを作成することができます (つまり、const-ness のキャスト アウェイを行います)。mutable
あなたのために)。he_the_great は、回答でそのようなテンプレートの例を示しています。しかし、そのようなテンプレートの使用はまだ未定義の動作です。実際に不変であるオブジェクトでそれを使用すると、問題が発生します。プログラマであるあなたは、それが正しく使用されていることを確認する必要があります。
したがって、D は const をキャストすることで論理的な const を持つことを技術的に可能にしますが、それを行うには、型システムをバイパスしてコンパイラが保証するものの外に出る必要があり、誤用しないようにする必要があります。それを変更して、変更してはならない/変更できない変数を変更します。そうしないと、コードに問題が発生します-セグメンテーション違反がそれらの中で最も少ない可能性があります。
編集:型システムを壊さない提案された解決策について言及するのを忘れていました。純粋性を放棄しても構わないと思っている限り、何らかの種類のグローバル変数 (モジュール スコープ、クラス変数、構造体変数など) を使用して、キャッシュされた値を保持できます。const 関数は、グローバル変数を自由に使用および変更できるため、欠落している の代わりに使用できますmutable
。ただし、これは関数が純粋ではないことを意味し、これも大きな問題になる可能性があります。ただし、型システムを壊すことなく、const 関数が必要なデータを変更できるようにする方法です。