空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

値渡しの const

ビルド待ちの間に,C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series) を読んでいたら,項目15の隅っこのほうに

関数宣言において,値渡しの関数パラメータのconst宣言は避けよう。次の2つの宣言はまったく等価である。
void Fun(int x);
void Fun(const int x);

とあった。2番目の宣言のconstは実装側の都合であって,それを使用者に押し付けるのはよろしくないし,冗長である。ここまでは,6割くらいのC++プログラマにとってはなんて事ない話だと思う。

ただ,この話には続きがあって,なんとC++では,「仮引数を非constで宣言して,const付きで定義することができる」とのこと。‥‥初めて知ったよ。

引用にあるとおり,宣言では等価だった Fun の例をみると,定義では

void Fun(int x)
{
    :
}

と書くのと,

void Fun(const int x)
{
    :
}

とでは,{} の中身のみにおいて,x に込められる意味が異なり,かつどちらも void Fun(int) の定義としては正しい。プロトタイプと定義が完全に一致しないというのは直感的ではないけれど,静的チェックにこだわる stoic なプログラマにはうれしい機能かと。
まぁ「値渡しは非const」でやってきた数年の資産があるし,すべての設計に関わるプログラマのレベルをここまで上げるのは,まず無理なので,(混乱を避けるため)いまさらスタイルを変えるわけには行かないわけですが。