14

関数のオーバーロードは、パラメーターの1つがconstとして宣言されている場合、同じ数のパラメーターを持つ2つのメンバー関数間で発生する可能性があります。

しかし、ある関数にconst引数があり、別の関数に同じ型のnon-const引数がある場合はどうなるでしょうか。参照とポインターに対して機能しますか?C ++がそれを提供する場合、なぜそれが提供するのですか?ご存知の方は理由を教えてください。

以下は、上記のシナリオを理解するのに役立つ例です。

void fun(const int i)
{
    cout << "fun(const int) called ";
}
void fun(int i)
{
    cout << "fun(int ) called " ;
}
int main()
{
    const int i = 10;
    fun(i);
    return 0;
}

出力:コンパイラエラー:redefinition of 'void fun(int)'

void fun(char *a)
{
  cout<<"non-const fun() called";
}

void fun(const char *a)
{
  cout<<"const fun() called";
}

int main()
{
  const char *ptr = "GeeksforGeeks";
  fun(ptr);
  return 0;
}

出力:const fun()と呼ばれる

2番目のものがC++で許可されているのはなぜですか?

4

2 に答える 2

14

最初のパラメーターはトップレベル constです。これは、関数がパラメーターの値を変更できないことを意味しますが、呼び出し元は気にしません。呼び出し先は引数のコピーを取得するため、パラメーターに最上位の constがある場合、それは実装の詳細です。以下が機能することに注意してください。

void f(int); // forward declare

void g(){ f(42); }

void f(int const i){ /*...*/ } // define above declared function

オーバーロードの 2 番目のセットでは、constはもはやトップレベルではありません。これは、呼び出し先がポインターが指すものを変更できるかどうかを示します。発信者として、あなたはそれを気にします。それはもはや単なる実装の詳細ではありません。

于 2012-10-02T18:36:14.753 に答える