非 const の変数を同一スコープ中で const に「凍結」する方法が欲しい

http://d.hatena.ne.jp/nagoya313/20100504/1272943262

この、値渡し引数に const をつける、ということに対して。


上に挙げた日記の書いてあることに概ね賛成ですが、
僕個人は値渡しの引数に対しては const は付けない主義です。


無論、付けてもいいと言うか、本来的には付けるべきなのですが、
果たして、 C++ において

「関数の宣言において、引数の(値としての) const 性は無視される」

という事を知っているプログラマが、どれほど居るのでしょうか。


僕が変数に対し const を付ける理由は、バグの防止とかは副次的な理由で、
const を付けることでソースコードの可読性が上がるから、というのが一番大きいです。
無論、バグの防止という側面も大きいのですが、それは単純なミスの防止というより、

「可読性が上がった結果として、バグの発見が行い易くなる」

という側面こそが大事なのだと思っています。


そして、その側面からは、どうしても引数を const にする事を躊躇ってしまいます。
const を付けられた値渡しの引数と const 参照渡しの引数というのは、パッと見で区別しにくい、という点が問題で、
これが普通の値渡しと非 const 参照渡しである場合には、また別なのですが、
普通のプログラマは、値渡し引数に const が付けられていた場合、

「これは const 参照渡しの typo なんじゃないか」

と思う可能性が高いのです。


また、それとは別の考え方で、単純に
「引数のリストという "what" を記述するべき場所に、その変数を変更するかという実装上の "how" を記述するのはおかしい」
という点も、値渡し引数に const を付けることを躊躇う理由です(プロトタイプ宣言と実装を分けて、実装では const を付ければいいじゃないか、って? 宣言と実装で関数の表面上の形が変化することを「可読性がいい」と思うなら、是非どうぞ)。
まぁ、そういう理由で、値渡しの引数に const を付けることはやめておいた方がいい、という本も少なくなく( Exceptional C++ とか)、
僕もその意見には賛成なので、今のところ、値渡しの引数には const を付けていません。


無論、値渡しの引数に const を付けるスタイルが、悪いというわけではないんです。
むしろ普通に const を付けたいです。でも、そうすると可読性が落ちてしまうのです。
これをどうにかするには、非 const な変数を、 const として再定義できればいいのですが、
残念ながら、現状のC++では、値のコピーを行わない限り、
同一スコープ中で非 const 変数を const 化することができません。

(スコープが違えば可能です。 http://twitter.com/kikairoya/status/11060473226

なので、 C++ において、非 const を const に「凍結」する方法があればいいなぁ、
とか思ったのでした。


一応、実用上は、

some_object x_;
x_.non_const_operation();
some_object const& x = x_;
// 以降 x_ は使わない

このように書けば実現出来ますが、
この後 x_ を変更しないと保証できないのが痛い。
せめて自動変数の名前を消去する方法があれば良いのですが。