我们可以仅基于参数是值还是引用来重载函数?

时间:2010-03-16 20:59:23

标签: c++ pass-by-reference overloading pass-by-value

我得到了答案否!因为按值传递并通过引用传递看起来与调用者相同。

但是,下面的代码编译正确

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;
}

为什么即使不知道它会被使用,编译器也不会禁用它?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

是的,它们可以根据引用而过载。这就是为什么让它们像这样共存是完全正常的;他们是不同的。

问题与歧义有关。虽然只能在一个变体上调用f(1),但两者都可以调用f(i)。两者都不可取,因此您会出现歧义错误。如果您添加了第三个功能foo (const int&)所有调用将不明确。但是所有人仍然相互重叠,并且没有冲突。

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