7

私は答えをNOを得ました!値による受け渡しと参照による受け渡しは、呼び出し元と同じように見えるためです。

ただし、以下のコードは正しくコンパイルされます

class A {

public:
void f(int i) {}    

void f(int& i) {}
};

しかし、使用しようとするとコンパイルエラーが発生します。

int main () {

   A a;
   int i = 9;
   int& j = i;
   a.f(1);
   a.f(i);
   a.f(j);
  return 0;
}

使用されることを知らなくても、コンパイラが無効にしないのはなぜですか?

4

2 に答える 2

9

各メソッドを呼び出すことができます。

void (A::*t)(int& ) =&A::f;
A a;
int i = 9;
int& j = i;   
a.f(1); //  f(int i)
(a.*t)(i); // f(int& i)
于 2010-03-16T21:15:52.300 に答える
3

はい、参照に基づいてオーバーロードすることができます。そのため、そのように共存させることはまったく問題ありません。彼らは違う。

問題はあいまいさに関係しています。f(1)1つのバリエーションでのみ呼び出すことがf(i)できますが、両方で呼び出すことができます。どちらも好ましくないため、あいまいさのためにエラーが発生します。3番目の関数、を追加した場合foo (const int&)すべての呼び出しがあいまいになります。しかし、すべてはまだお互いの過負荷であり、競合していません。

関数のオーバーロードを3つ持つことができ、どれも直接呼び出せないのは奇妙だと私は同意します。おそらく、他の誰かがさらに追加する必要があります。

于 2010-03-16T21:11:48.000 に答える