読者です 読者をやめる 読者になる 読者になる

C++ の const の問題点

バグというのは、意図しないところで状態が変更されることにより発生することが多く、
C++のconstメンバ関数は、メンバの状態が変更されないことを保証する、という強力なチェックを
提供してくれるので、mutableとconst_castという例外を除いてメンバの状態変更によるバグは起こりえません。

constメンバ関数はとても強力なので、const操作な関数には常にconst付けてほしいです。
というか、付けてくれないと本当に困るので付けてください。const付けてください。

C++ で const メンバ関数にすべきところで const になってないと本当に迷惑ってのは同意.
ただ,const T なオブジェクトを直接触れるときはいいんだけど,現実問題として const T* とか const T& で引き渡されてくることが結構あって,その場合は const メンバ関数だろうがそうじゃなかろうが結局内部状態の変更は気にしないといけないのが割と嫌.

void foo(const X& x) {
  // (1)
  x.Foo(); // X::Foo は const メンバ関数
  // (2)
  bar();
  // (3)
}

X::Foo が const メンバ関数だったとして,さらに const_cast とか mutable がどこにも使われていなかったとしても,やっぱり (1) と (2) の間で x のメンバの状態が変わっていないという保証はないし (マルチスレッドとか割り込みとか),x とは一見無関係に見える bar() が x のメンバの状態を変えてしまうこともできる.
なんかこの話,前も書いた気がする.

そういや,まだちゃんと D を試せてない.

単純化を目的として、Javaはconstを無くしてしまいました。 しかし、書き換え不能文字列や、よく使われる防御的コピーのテクニックは ひいき目に見ても不格好です。結果として、言語に const を取り戻すのが 産業界やアカデミアで人気のお遊戯になってしまっています。 とはいえ、C++ の const にも幾つもの重大な欠点があります。そこで、D ではこのconstの概念を一から十まで設計し直しました。 この記事は、const性がどのような場面に有用なのか、C++のconstはそれをどう解決しているのか、 そしてDのconstがそれをどう解決しているのかについて詳しく考察したものです。