、C言語では、非配列データ型T
ためconst T *
を入力するタイプT *
からの暗黙的な変換をサポートします。これは、C言語がサポートする唯一の "const-protect"暗黙の変換です。 T
とU
が同じ非配列型である場合すなわち
は、T *
からconst U *
への変換がサポートされています。 T
がU
と何らかの形で異なる場合、暗黙の変換は無効です(T
とU
の違いがほんの追加のconst修飾子であっても)。
簡単に言えば、const
は、最も内側の後にのみ追加することができます*
。あなたは間接指定のより深いレベルでconst
を追加することはできません。これは、p5
とcube
の行がコンパイルに失敗する理由です。
int *p = 0;
const int *cp = p; // OK: `const` is added after the first `*`
int **pp = 0;
const int *const *cpp = pp; // Error: a "deep" `const` added
時々、あなたのコードでは、これらの制限を回避し、間接のより深いレベルでいくつかの余分なconst
を追加する必要があります。その場合、明示的なキャストを使用する以外に選択肢はありません。
int **pp = 0;
const int *const *cpp = (const int *const *) pp;
P.S. C++はこれらの制限のいくつかを緩和し、const正当性ルールのより論理的なシステムを作成しました。悲しいかなCは決してその方向で何の措置もとらなかった。
出典
2017-02-11 18:07:12
AnT
「追加保護を追加する方法のルール」は、どの保護を達成しようとしているかによって異なります。保護する必要があるものと保護されないものを知っているのはあなただけです。 – AnT