私はconstの正確さの意味を理解しています。私の質問はconstの正確さについてではありません。そのため、説明やC++-FAQリンクは期待していません。
私の質問は:
const
とC++のconst
の意味上の違いは何ですか?および相違点を明確にするそれぞれの標準からの引用はあるといいでしょう。
私はCとC++を定期的に切り替えていますが、その際に留意すべき重要な点を知りたいのです。
私はこれらの理由を覚えていないようです(推論を提供できる場合は特に感謝します)が、私の頭の中から覚えています。
char const*
でなければなりませんが、Cではchar*
にすることができます。何が欠けていますか?
あなたが引用する違い、およびスティーブ・ジェソップが言及するライブラリの違いに加えて、
char* p1;
char const* const* p2 = &p1;
c ++では合法ですが、Cでは合法ではありません。歴史的に、これはCが最初に許可したためです。
char* p1;
char const** p2 = &p1;
標準が採用される少し前に、これがconstの安全性に穴を開けたことに気づきました(*p2
にchar const*
を割り当てることができるため、p1
にchar const*
が割り当てられるため)。問題を詳細に分析するリアルタイムがないため、C委員会はトップレベルのconst以外の追加のconst
を禁止しました。 (つまり、&p1
をchar **
またはchar **const
に割り当てることはできますが、char const**
やchar const* const*
に割り当てることはできません。)C++委員会はさらに分析を行い、const
レベルの後にのみ問題が存在することを認識しましたconst
レベルではなく、必要な表現を理解しました。 (標準の§4.4/ 4を参照してください。)
Cでは、const
宣言は定数式を生成しません。つまり、Cでは、ケースラベルでconst int
オブジェクトをビットフィールド幅または非VLAの配列サイズとして使用できません。配列宣言(これはすべてC++で可能です)。また、constオブジェクトには、Cのデフォルトで外部リンケージがあります(C++の内部リンケージ)。 C++言語のconst-correctnessルールは、次の標準変換をサポートしています
int **pp = 0;
const int *const *cpp = pp; // OK in C++
int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++
これらはcでは機能しません。
これらの違いのいくつかの理由は、Bjarneの初期の設計目標の1つであったプリプロセッサマクロを削除できるようにするためです。
Cでは
#define MAX_FOOS 10
int foos[MAX_FOOS];
C++では、次のように記述できるようにします
const int max_foos = 10;
int foos[max_foos];
そのためには、max_foos
が定数式で使用できる必要があります。また、内部リンケージが必要です。これにより、定義が複数の定義エラーを発生させることなくヘッダーに表示され、さらに重要なことに、コンパイラーがmax_foos
にストレージを割り当てないようにすることが容易になります。
C委員会がC++からconstを採用したとき、彼らはマクロへの反感を採用しなかったので、これらのセマンティクスを必要としませんでした。