1

関数の 2 番目のバージョンを定義するconst場合、これを実行しても安全であることが保証されていますか? 戻りたいので無限再帰があるように見えますconstが、呼び出すつもりの他の関数は非定数です。

g ++で動作しますが、これは安全ではないのではないかと心配しています.

#include <iostream>

using namespace std;

class test {
public:
   int* doSomething(int a) {
      int* someInt = new int(a);

      return someInt;
   }

   const int* doSomething(int a) const {
      return doSomething(a);
   }
};

int main() {
   test a;

   cout << *a.doSomething(12345) << endl;

   return 1;
}
4

2 に答える 2

3

そうではありません: @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; }
};
于 2016-01-25T01:21:50.157 に答える