2017-07-12 8 views
1

コンパイル時にコンパイラがエラーを表示します。 ( - > int型のconst int型)C++ - トップconstポインタを別の非constポインタに割り当てることはできません

int main() 
{ 
    int var, *p1; 
    const int *p2 = &var; 
    p1 = p2; 
    return 0; 
} 

無効な変換である:それは、このから

p1 = p2; 

があることを私に伝えます。 Varはconstではないので、妨げてはいけません。私は、p2はvarの値を変更するために使用することはできませんが、私はそれがちょうどp1にvarの場合は、アドレスを割り当てる必要がありますと思う。

私はこのことを知っている:

p1 = &var; 

は、同じ結果が得られ、前者が動作しない理由は何を私に興味があります。これは、C++の内部動作についての好奇心から外れています。

私の言語(C++と英語)については申し訳ありませんが、私はプログラマーでもネイティブスピーカーでもありません。

ありがとうございます。

+4

それが指す 'int'を変更するのに' p2'を使うことは決してできません。 'p2'を' int * 'に割り当てることができれば、それを変更することができます。 'p2'が' const int'を実際に指している場合を考えてみましょう。代入 'p1 = p2'は' const'オブジェクトに値を代入することを可能にします。 –

+1

コンパイラは 'var'を気にしません。 'p1 = p2'に' var'はありません。 'p1 = p2'では' const int * 'を' int * 'に変換しようとしています。これはC++では許可されていません。 – AnT

+0

私はあなたが混乱するかもしれないと思うのは、constへのポインタに割り当てられていても、 'var'は*実際には*可変であり、コンパイラはこれを理解してポインタへの代入を可能にすべきだと思います非constに?これは、フロー解析でワームの蓋を開き、コンパイラが常に正しくなることは不可能です。また、プログラマーにとっては、上記より複雑なコードを混乱させるでしょう。 –

答えて

2

Emm ... p1の宣言されたタイプはint *です。そしてp2のタイプはconst int *です。
const int*int*に割り当てることはできません。 varintタイプであり、const intではないため、
p1 = &varが許可されています。

+1

私はOPが*なぜ* const int *から 'int *'への代入を禁止するルールがあるのか​​と尋ねていると思います。 –

+0

@FrançoisAndrieuxおそらく。 :)合法的な 'b = c'と' a = c'ならば、それは正当な 'a = b'でなければならないと誤解していたと思います。しかし、代入演算子は、キャストの種類を使用するため、推移的ではありません。 –

+0

私は 'var'が変更可能であることを知っていたので混乱していました。' p2'は 'var'がconstではないことをコンパイラに知らせることができません。したがって、const int *が定数を指しているかどうかわからないので、const int *をint *に代入することは禁じられています。そして 'const int'を' int * 'に代入することはできません。右? –

関連する問題