1

C++ を初めて使用し、const_cast を学習している場合 — 以下のコードで本当に混乱します。

int main(){
    const int j = 1;
    int * p = (int *)(&j);
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;
    *p = 2;
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;

    const int k = 1;
    int * q = const_cast<int*>(&k);
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;
    *q = 2;
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;

    return 0;
}

出力は

1 1
00A2FD9C 00A2FD9C
1 2
00A2FD9C 00A2FD9C
1 1
00A2FD84 00A2FD84
1 2
00A2FD84 00A2FD84

アドレス (&i と p、または &j と q) は同じなのに、値 (i と *p、または j と *q) が異なる理由を教えてください。Visual Studio 2013RC を使用しています。

4

2 に答える 2

0

const_cast<T*>(obj)constness をキャストするために使用し、オブジェクトobj変更すると、その寿命が定数として開始された場合、未定義の動作になります。あなたの例では、コンパイラーに変更しないことを伝え、コンパイラーはすべての使用をj, の使用に置き換えるだけです。その後、約束を破ると、コンパイラが生成したコードはもはやあなたに注意を払わず、代わりにそれが好きなことをします.j1

于 2014-01-05T20:59:13.080 に答える