49277
const_castの使い方なのですがなぜ`const int z = 0`をソースファイルの一番外側に書くとアクセスエラーにり`int
main()`の中(//コメント部)に書くとエラーが起きないのでしょうか？  
`const int z = 0`をソースファイルの一番外側に書いた場合をどうすればアクセスエラーを防げるのかを教えてほしいです。

```

    #include <iostream>
    #include "conio.h"
    #include <iomanip>
    #include "math.h"
    #include <list>
    using namespace std;
    
    const int z = 0;
    
    int main() {
    
        //const int z = 0;
    
        int *zz = const_cast<int*>(&z);
        *zz = 5;
        cout << *zz;
    
        _getch();
        return 0;
    }
    
```
CC BY-SA 4.0
2018-10-14T05:11:33.023
49259
2018-10-23T02:43:02.690
2018-10-14T07:53:38.780
19110
question
c++
const 変数でアクセスエラーが出る理由 const_cast<>()
[複数あるキャスト記法をどのように使い分ければいいか教えてください](https://ja.stackoverflow.com/questions/44260)  
でも書きましたが  
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") 言語仕様書 ISO/IEC 14882:1998
(古くてごめん) によると  
5.2.11 const cast の 7 を引用  
定値性キャストを使って定値修飾子を落としてしまって得たデータメンバのポインタ、左辺値、またはポインタを介して書き込みを行うと未定義の動作を生じるかもしれない。

つまり `const` なオブジェクト（変数と言い換えてもOK) 提示例では `z` を、 `const_cast` でその `const`
性質を無理やりはがして書き込みアクセスするのは未定義動作です。未定義動作とは  
[C : 配列の添字について](https://ja.stackoverflow.com/questions/15206/)  
で解説してありますが、要するにバグっているプログラムであって何の動作保証もないってことです。  
\- 実行時エラーが検出されることもある  
\- プログラマの勝手な期待通りに動く場合もある  
ってあたりが厄介ですね。

なので質問「エラーを防げますか」に対する答えは「ありません」（そのようなプログラムはバグっているので、そういう書き方はダメ）ということになります。

実際、組み込み系ワンチップマイコンではコンパイル時に値が確定している `const` なオブジェクトは変更されないことを前提に ROM 上に配置され、貴重な
RAM を使わずに済むようになりますが、当然、実行時に変更することは不可能です。
CC BY-SA 4.0
2018-10-14T21:58:15.423
49277
2018-10-14T23:04:41.390
2018-10-14T23:04:41.390
8589
8589
49259
answer
できるできないという話以前に、そもそもconst変数の値を変更するようなコードを書くべきではない（もしくはconstにする意味が無い）、と思うのですが。

それとも意外とそういう用途（ハック？）があるのでしょうか？  
もしあるなら、後学のために教えて欲しいです。
CC BY-SA 4.0
2018-10-23T02:43:02.690
49551
2018-10-23T02:43:02.690
8063
49259
answer