mutable

C++のキーワードmutableを知っていますか?
これはクラスのメンバを定義する時につかう修飾子です。

例えばこんな感じ

class Test
{
public:
  int		 index_;
  mutable double value_;
public:
  Test(int arg = 0) : index_(arg), value_(0.0) {}
};

mutable修飾子がついたメンバは

  • const変数として定義されたインスタンス
  • const指定されたメソッド内部

であってもメンバの値が変更可能です。

さっきのコードでならindex_という変数は変更不可能だけどvalue_は変更可能です。

知ったときはへ〜こんなのあるんだ。何時つかうんだろ?と思っていました。
しかし,この前ついにこのキーワードをタイプする日がやってきました。


データの重複をチェックしながら見つからなければ登録する,すでに登録済みなら印をつけるという処理をstlで提供されているsetでやろう思い,調べてみると

setのfindメソッドの戻り値がconst iteratorでした。

const iteratorなのでfindで見つかったものに対して値を設定できないという状態になるわけです。

で,その解決策としてmutableをつけちゃいました。


ところで,const 指定するとコンパイラの最適化に効果があるはずですが,
そこにmutableがからむと最適化の効果がなくなるのではと思いますが今回はそこは考えませんでした。