C++ のキャスト - const_cast

今回は C++ のキャスト のうち、 const_cast を見てみます。

 const char *str = "Hello";
 char *ptr = const_cast<char *>(str);
これは const 修飾子をはずすためのキャストで、使うべきキャストではありません。変えないと宣言しているのを変えるためのものですから、なぜ使うべきではないかは明らかでしょう。
逆に const の方にキャストするのは、変えても変えなくてもいいものを変えないと宣言するだけなので、何も問題ありませんし、明示的にキャストする必要もありません。



では、どうしても const を外さないといけない場面はあるでしょうか。
私は必要な場面は 2 つ程あると思います。


まず、一つは Motif などの古くからあるライブラリーを使っている場合です。
const に対応していないダメなインターフェースなのに、 互換性などのために引きづられて残っていることがあります。 こういった場合には const_cast を使わざるを得ません。


あとは、次のようなポインターを返す関数の場合です。
char *case_strchr(const char *str, char chr)
{
    char lch = tolower(chr);
    for (; *str ; str++) {
        if (tolower(*str) == lch)
            return const_cast<char *>(str);
    }
    return NULL;
}
この場合は、引数として受け取ったものを使った側に返しているだけなので、問題はないですし、 const char * を返すようなインタフェースにしてしまうと使いづらいものになります。

ただし、 これは C 形式の関数ですし、使おうと思えば const 外しの関数としても使えるようになってしまいます。 C++ の標準ライブラリのように位置やイテレータを返すようなものを作った方がいいと思います。

STL 標準講座―標準テンプレートライブラリを利用した C++ プログラミング (Programmer ’ s SELECTION)STL 標準講座―標準テンプレートライブラリを利用した C++ プログラミング (Programmer ’ s SELECTION)
(1999/08)
ハーバート シルト

商品詳細を見る

Effective STL ― STL を効果的に使いこなす 50 の鉄則Effective STL ― STL を効果的に使いこなす 50 の鉄則
(2002/01)
スコット メイヤーズ

商品詳細を見る
関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
33位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

04月 | 2017年05月 | 06月
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。