2

私が読んでいる C++ (C++ for Dummies) に関する本には、次のようなセクションがあります。

int nVar = 10;
int* pVar = &nVar;
const int* pcVar = pVar; // this is legal
int* pVar2 = pcVar;      // this is not

その後、本書は次のように説明しています。

割り当て pcVar = pVar; 大丈夫です - これは const 制限を追加しています。pcVar の const-ness を削除しようとするため、スニペットの最後の代入は許可されません

私の質問は、最後の行が「合法」ではない理由です。それがpcVarの「一貫性」をどのように妨げているのかわかりません。ありがとう。

4

7 に答える 7

3
const int *pcVar = pVar;
int *pVar2 = pcVar;

pcVarである場合、それが指している が である可能性があることconst int *を意味します。(この場合はそうではありませんが、そうかもしれません。)したがって、非 const であるを割り当てた場合でも、it ポイントを変更できます。intconstpVar2int *int

したがって、pcVar 実際に a を指していて、そのアドレスconst intに an を割り当てた場合、そのポインター (この場合) は、逆参照によってそれを変更することを許可しますが、これは違法です (これは制約違反であるため、未定義の動作を呼び出します)。int *int *pVar2

于 2013-03-05T19:09:20.153 に答える
2

constだったものから非ポインタを作成できないと言っているだけですconst(少なくとも、なしではありませんconst_cast)。

const の背後にある考え方は、誤って変更できないオブジェクトを持つことです。const単純な割り当てで取り除くのは非常に危険であり、次のようなことが可能になります。

void function(int* m) {
    *m = 20;
}

int main() {
    const int x = 10;
    //Oops! x isn't constant inside function any more, and is now 20!
    function(&x); 
}

また、 The Definitive C++ Book and Guide Listもチェックしてください。参考文献がたくさんあります (C++ for dummies はあまり役に立ちません)。

于 2013-03-05T19:08:01.840 に答える
2

コンパイラが知っているpcVarのは、それがconst int*. つまり、 を指しconst intます。あなたがそれを非に向けたからといって、問題でconst intはありません。コンパイラーが認識している限り、ポインター値はある時点で真を指すように変更されている可能性がありますconst int。したがって、コンパイラは、それが指していたオブジェクトの性質について嘘をついているためconst int*、 aから a に変換することを許可しません。int*const

より単純な例として、次のことを考慮してください。

const int x;
const int* pc = x;
int* p = pc; // Illegal

ここで、xtrue はconst intです。その 3 行目を実行できれば、( を実行して)const intオブジェクトにアクセスして変更することができます。それは悪いことです - それには理由があります。p*pcxconst

ただし、指定した例では、元のオブジェクトが non-であることがわかっているため、コンパイラにあなたを信頼させるためにconst使用できます。const_cast

int* pVar2 = const_cast<int*>(pcVar); 

これは、オブジェクトが非であることが確実にわかっている場合にのみ有効であることに注意してくださいconst

于 2013-03-05T19:08:46.080 に答える
1

pcVar は同じままですが、pVar2 は非 const を指します。const を追加することはできますが、削除することはできません。コンパイラは、元の nVar が非 const であることを確認せず、const を非 const に割り当てようとするだけです。そうしないと、const を回避して値を変更できます。

于 2013-03-05T19:08:12.923 に答える
1

const と non-const を混在させることは違法です。その理由は、ある場所の値が const であることをコンパイラーに伝え、別のポインターを使用してその値を変更すると、最初の要素で作成した const 契約に違反したことになります。

于 2013-03-05T19:07:24.123 に答える
1
int * pVar = &nVar;
*pVar = 4 //is legal

const int* pcVar = pVar; // this is legal
*pcVar = 3 // this is not legal, we said the value was const thus it can not be changed

int* pVar2 = pcVar;      // this is not legal because...
*pVar2 = 3 -> *pcVar = 3 
于 2013-03-05T19:10:42.287 に答える
1

2 行目 int pVar = &nVar; エラーです。g ++コンパイラは言う。エラー: 'int*' から 'int' への変換が無効です</p>

于 2013-03-05T19:11:33.147 に答える