私が持っている例:i
のアドレスはのconst int型へのポインタに変換される場合にはこの場合資格の変換はどのように行われますか?
int i = 1;
const int *b = &i;
を、私は理解していないこと 、です。修飾変換でi
がconst整数に変換されませんか?資格の変換が適用されるとき、フードの下で正確に何が起こるのですか?
私が持っている例:i
のアドレスはのconst int型へのポインタに変換される場合にはこの場合資格の変換はどのように行われますか?
int i = 1;
const int *b = &i;
を、私は理解していないこと 、です。修飾変換でi
がconst整数に変換されませんか?資格の変換が適用されるとき、フードの下で正確に何が起こるのですか?
フードの下で何も起こりません。 const
は厳密にコンパイル時エンティティです。コンパイラは、文がエラーであり、コードを生成しないかどうかを決定するために、const
という知識のみを使用します。従って、以下:
int i = 1;
const int *b = &i;
は、生成されたコードの用語で
int i = 1;
int *b = &i;
と等価です。しかし、あなたは次の操作を実行した場合:
int i = 1;
const int *b = &i;
*b = 1;
をコンパイラがb
は(それがi
の何も知らない間に)const
を持っており、アウトエラーになります気づくでしょう。しかし、追加されたconstでエラーとみなされないステートメントは、constの有無にかかわらず同じコードを生成します。私の
アドレスが
ん int型のconstへのポインタに変換されます。 &i
はまだint
(const int
ではない)のアドレスです。フードの下でint*
は暗黙的にconst int*
に変換されます。したがって、*b
は変更できませんが、i
は依然として変更可能です。あなたの仮定が真であるならば、コンパイルエラーになります以下ですが、それはできません:
はまた、別の方法で考える
int i = 1;
const int *b = &i;
int *c = &i; // perfectly valid !
+1役立ちます。この回答はどの参考文献か本から来ますか? – user1086635
@ user1086635:これについてのリファレンスはありませんが、標準のどこかで見つけることができます。 – Dani