【C++学習|初心者向け】C++の謎文法?「const const int」はなぜ許されるのかを解説!

1. 導入:なぜ「const」が二つ並ぶのか?

C++を書いていると、稀に「const const int」のように、修飾子が重複しているコードに出会うことがあります。「そんな書き方は間違っているのでは?」と思うかもしれませんが、実はコンパイルエラーにはなりません。なぜこのような記述が許容されるのか、そしてそれが実務でどのような意味を持つのかを解説します。

2. 基礎知識:const修飾子とは

constは、変数の値を変更不可能にするための修飾子です。一度初期化すると、プログラムの実行中にその値を書き換えることはできません。

C++の文法において、constvolatileといった修飾子は「型修飾子」と呼ばれます。興味深いことに、C++の規格では、同じ型修飾子を複数重ねて記述しても、単一の修飾子として解釈するというルールがあります。これを「冗長な修飾」と呼びます。

3. 実装と解決策:なぜ発生するのか?

手書きで「const const int x = 10;」と書く人はまずいません。しかし、この現象は主に「マクロ」や「テンプレートメタプログラミング」の世界で発生します。

例えば、以下のようなケースです。
・ある型にconstを付与するマクロがあるとする。
・そのマクロを、すでにconstがついている型に対して適用してしまう。

このように、自動生成されるコードや複雑なマクロ展開の結果、意図せず重複が発生することがあります。コンパイラはこれをエラーとせず、「constが一つあるのと同じ」として処理を継続します。

4. サンプルプログラム

以下のコードをコピーして、実際にコンパイルが通ることを確認してみてください。

include <iostream>

int main() {
    // 通常のconst宣言
    const int a = 10;

    // 重複したconst宣言(const constは単なるconstとして解釈されます)
    const const int b = 20;

    // どちらも読み取り専用として扱われます
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;

    // b = 30; // これをアンコメントするとコンパイルエラーになります(変更不可のため)

    return 0;
}

5. 応用・注意点:現場での考え方

この「重複したconst」は文法的には正しいですが、コードの可読性を著しく下げます。

自動生成コードの場合:ツールが生成するコードであれば無視しても構いませんが、手動で修正可能な場合は整理することをお勧めします。
バグの温床:「const const」と書くことで、プログラマが「何か特別な意味があるのではないか?」と勘違いし、コードの理解に余計なコストがかかってしまいます。

現場のコーディング規約では、このような冗長な記述は「修正対象」とされることがほとんどです。見かけた場合は、基本的には一つにまとめるリファクタリングを行うのが、クリーンなコードを保つコツです。

コメント

タイトルとURLをコピーしました