読者です 読者をやめる 読者になる 読者になる

const_cast

const_castは、ポインタや参照のconst属性を削除するキャスト演算子・・・。
(通常の変数のconstは削除できないので注意!)

char型配列strを"ABCDE"で初期化・・・。
constなptr1にstrのアドレスを渡す・・・。
int型のiは10に初期化・・・。
constな参照jにiの参照を渡す・・・。

strとiをいったん出力・・・。

str[0]を'F'に書き換える・・・。strはconstでないので当然できる・・・。
*(ptr1 + 1)、つまりptr1の1番目を'G'に書き換えようとしたが、ptr1はconstなのでこれはコンパイルエラーとなる・・・。
なのでコメント・・・。
ptr1を非constなptr2に渡して、ptr2の1番目を'G'に書き換える・・・。これはできてしまう・・・。
できてしまうのだが、やはりC言語キャストだとconst削除であることを明示してないので、次はconst_castでptr1をptr3に渡す・・・。
ptr3から2番目を'H'に書き換え・・・。
これでstrの書き換えは終わり・・・。

次はiに20を代入・・・。非constなので問題ない・・・。
jはconstなので30をそのまま代入してもコンパイルエラー・・・。
intの参照として新たにkを宣言し、jをC言語キャストで渡す・・・。
これもできてしまうのでkに40を代入することもできる・・・。
今度は、intの参照lを宣言し、jをconst_castで渡す・・・。
でlに50を代入できる・・・。

再度出力・・・。

$ vi const_cast.cpp
$ g++ const_cast.cpp -o const_cast
$ ./const_cast
str = ABCDE
i = 10
str = FGHDE
i = 50
$

strの書き換え、iの書き換え、ともにできている・・・。
このようにconst属性を削除できるわけだが、constにした意味もないし、危険なので、使う場面はあまりないだろう・・・。

Sample/const_cast.cpp at master · bg1bgst333/Sample · GitHub