そうではありません: @Pete Becker がコメントで指摘したように、再帰するバージョンを呼び出したconst場合:
class test {
public:
int* doSomething(int a) {
int* someInt = new int;
*someInt = a;
return someInt;
}
const int* doSomething(int a) const {
return doSomething(a);
}
};
int main() {
const test a;
// You're not in for a good time:
a.doSomething(12345);
return 1;
}
重複したコードを必要とする関数のconst非バージョンを提供する場合は、そのバージョンを実装してから、非バージョンに特定の方法でそれを呼び出させるのが最善です。constconstconst
スコット マイヤーズ効果的な C++ - 第 3 版から:
constと非メンバー関数の実装が本質的に同一の場合、非バージョンにバージョンを呼び出すconstことでコードの重複を回避できます。constconst
Scott Myers は、これを行うための安全な手段を提供し続けています。
const int* doSomething(int a) const
{
int* someInt = new int;
*someInt = a;
return someInt;
}
int* doSomething(int a)
{
return const_cast<int*>(static_cast<const Test&>(*this).doSomething());
}
非constバージョンでは、2 つのキャストstatic_castがあります。非バージョンを呼び出すには、非バージョンが必要なので、これは安全です。thisconst thisconst_castconstconstconst this
ただし、メンバーへのアクセスを提供するだけの場合は、次のようにするだけで簡単に読みやすくなります。
class TestAccess;
class Test
{
TestAccess& t;
public:
const TestAccess& getA() const { return t; }
TestAcess& getA() { return t; }
};