C++ の相反する const と mutable を同時に使う理由2021年03月18日 11時54分55秒

C++ には const と mutable のキーワードがある。「const」は「不変」を意味し、「mutable」は「可変」を意味する、全く相対した言葉。そして、使われるのは同じ場面になる。

const は分かりやすい概念。const 変数は、その名の通り不変定数。パイの 3.14 を定義するのに使ったり出来る。const 関数は、クラスの概念。その関数がメンバ変数を変更しないのを確約する。しかし、それに呼応する mutable 関数は無い。

const が無ければ、変更可能なのだが、mutable とはこれ如何に。

mutable 変数は const 関数内でも、値を変更可能な事を示す。mutable は const 関数内でも値を変更できる。そして、mutable 変数と const 関数を合わせた概念はクラス変数の内部状態を変更しない事の明示的な宣言をすること。要約すると、mutable 変数はキャッシュの役割をする変数に使う。const 関数内では、クラスの内部状態などを変更しないが、遅延作業などで、内部の状態を変更しない変数に使う。

例としては、数字を保持する Number クラスの string 型を得たい時等が、あげられる。

class Number
{
    int n;
    mutable std::string str;

    const std::string& to_string() const
    {
        if( str.empty() )
            str = std::to_string( n );
        return str;
    }
};

const 変数を変えられてしまっては意味無い。const で無いものは元々可変。それ故、mutable 関数は存在しない。