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)只能在一种变体上f(i)调用,但可以在两种变体上调用。两者都不是可取的,因此您会因模棱两可而出错。如果您添加了第三个函数 ,foo (const int&)所有调用都将是模棱两可的。但所有这些仍然是彼此的重载,并且不冲突。

我同意能够拥有三个函数的重载并且能够直接调用一个函数是很奇怪的。也许其他人还有更多要补充的。

于 2010-03-16T21:11:48.000 回答