1. 導入:なぜ「const」が二つ並ぶのか?
C++を書いていると、稀に「const const int」のように、修飾子が重複しているコードに出会うことがあります。「そんな書き方は間違っているのでは?」と思うかもしれませんが、実はコンパイルエラーにはなりません。なぜこのような記述が許容されるのか、そしてそれが実務でどのような意味を持つのかを解説します。
2. 基礎知識:const修飾子とは
constは、変数の値を変更不可能にするための修飾子です。一度初期化すると、プログラムの実行中にその値を書き換えることはできません。
C++の文法において、constやvolatileといった修飾子は「型修飾子」と呼ばれます。興味深いことに、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」と書くことで、プログラマが「何か特別な意味があるのではないか?」と勘違いし、コードの理解に余計なコストがかかってしまいます。
現場のコーディング規約では、このような冗長な記述は「修正対象」とされることがほとんどです。見かけた場合は、基本的には一つにまとめるリファクタリングを行うのが、クリーンなコードを保つコツです。

コメント