Effective C++ 第1章3項
あるクラスのメンバ関数でconstと非constの両方を用意した場合、それぞれに同じ処理のコードを書くという面倒なことになってしまう。それを避けるためには非constの関数ではconstな関数をconstを取り除いて呼ぶようにすればよい。実際に[]演算子で実装した例が次の通り。
class Test { private: char* m_pText; public: const char& operator[](std::size_t pos) const { // 何らかの処理 たとえば範囲チェックなど。 // ... return m_pText[pos]; } char& operator[](std::size_t pos) { return const_cast<char&>( static_cast<const Test&>(*this)[pos] ); } };
非constの関数ではまず*thisをstatic_castでconstを付けて[]を呼び出し、const_castでconstを取り除いている。
逆にconstの関数から非constの関数を呼ぶというのは良くない。constの関数は値を変更しないというのを保証しているものだから、内部で非constな関数を読んでしまってはそれが保証できなくなってしまう。