ローカル変数に対するconst

って付けるべきなのか付けないべきなのかーと少し考えてみました。
constを付けるメリットとしてよく聞くのが、

struct Hoge
{
    int v;
    void reset(int n) { v = n; }
};

void f()
{
    const int n = 100;
    const Hoge h = { 10 };
    ... // いろいろな処理
    n = 50; // エラー
    h.reset(5); // エラー
}

とかやってもちゃんとエラーになってくれるから嬉しいよね、とか const って書いてて書き換わらないことが分かるから見通しがよくなるよね、とかそういうのだと思います。
でもこれって、うっかり再代入してしまったり const を書くぐらいで見通しがよくなってしまうぐらいの長いコードを書くこと自体が問題な気がするので、const 付けて頑張って防御するよりそっちの方を何とかした方がいいんじゃないかなと。もちろん付ける必要が無いわけではなくて、付けた方が安全でしょうし const を 100 回 1000 回書く手間なんて大したものでもないので、とりあえず全部に付けちゃうのもありだと思います。


で、もう少し const というのを意味的な方向から考えてみようと思います。
ローカル変数に対する const は「その値はこのスコープ中では変更されないよ」というのを書き手が表明したことになるわけです。まあ他にも意味があるかもしれないですがとりあえずそれだけだとしておきます。
この表明は、逆に言えば書き手が「これは変更されない値だ」という意志を持っていない限りは const を付けるのは意味的に間違いだということです。つまり「全部 const にしちゃおう」「あれ、何か値書き換えちゃってエラーになっちゃった。でも const だったからセーフ!」となるのは、書き手が値に対する const 性を正しく表明できていないわけで、「const にしておいて良かったね」とか喜ぶ場面ではなく正しく意味を与えていなかった自分を恥じるべきなのです。
もちろん逆のケースで「const にしてなかったから実行時にバグが出た!」とかなった場合も同じです。これも書き手が const 性を正しく表明できていないのです。まあ実際にはコンパイル時にエラーが出た方がいいんでしょうけど、それは今のレイヤーだと無関係です。


そう考えていくと、const を付ける・付けないは、意味的にその値は const であるのかどうかというのを考えた上で付けるべきなのかなぁとか考えたり。
まあその「意味的」っていうのはすごい曖昧な感じなので微妙ですけど。何かうまく表現する方法はないのかなぁ。


あと最近「const教」なるものが自分の周りで流行ってて、ローカル変数にもどんどんconstを付けていこうとかそういう動きらしいです。↑に書いた通りあまり反対はしないですが、意味的な文脈を無視してとりあえず付けておけというのは微妙かなぁという気はします。でもどんどんconstを付けていこうというのが「意味的にconstである値にしかならないように考える」というのであればすごくいいと思います。