8
int main()
{
    const int ia = 10;

    int *pia = const_cast<int*>(&ia);
    *pia = 5;

    std::cout << &ia << "\t" <<  pia <<endl;
    std::cout <<  ia << "\t" << *pia <<endl;

    return 0;
}

出力は次のとおりです。

0x28fef4       0x28fef4
10             5

*piaiaアドレスは同じですが、値が異なります。私の目的はconst_cast、定数値を変更するために使用することですが、結果として機能しないことが示されています。

誰かが理由を知っていますか?

4

2 に答える 2

9

10表示される理由iaは、コンパイラの最適化である可能性が最も高いです。constオブジェクトを確認し、変更しないと判断し、最後の出力を次のように置き換えます。

cout<< 10 <<"  "<<*ppa<<endl;

つまり、生成されたコードにはconst、バイナリに「焼き付けられた」値があります。

最初に as として宣言されたオブジェクトの const 性をキャストし、constそのオブジェクトに書き込むことは、未定義の動作です。

$5.2.11/7 - 注: オブジェクトのタイプによっては、const-qualifier68 をキャストする const_cast から生じるポインター、左辺値、またはデータ メンバーへのポインターを介した書き込み操作は、未定義の動作を引き起こす可能性があります (7.1.5.1) .

プラットフォームによっては、const書き込みができないメモリの保護領域にオブジェクトが配置される場合があります。const型システムの -ness を回避すると、プログラムのコンパイルに役立つ場合がありますが、ランダムな結果が表示されたり、クラッシュすることさえあります。

于 2013-10-06T11:55:59.760 に答える
7

定数値を変更する動作は未定義です。やらないでください。値を変更する必要がある場合は、 として宣言しないでくださいconst

于 2013-10-06T11:55:46.567 に答える