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

sky*_*oor 7 c++ overloading pass-by-reference pass-by-value

我的答案没有!因为按值传递并通过引用传递看起来与调用者相同.

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

class A {

public:
void f(int i) {}    

void f(int& i) {}
};
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它时,会出现编译错误.

int main () {

   A a;
   int i = 9;
   int& j = i;
   a.f(1);
   a.f(i);
   a.f(j);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

a1e*_*x07 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)
Run Code Online (Sandbox Code Playgroud)

  • `(a.*f)(i);`应该足够了. (5认同)

GMa*_*ckG 3

是的,它们可以根据参考进行重载,也可以不重载。这就是为什么让它们这样共存是完全可以的;他们是不同的。

问题与歧义有关。虽然f(1)只能在一种变体上调用,但f(i)可以在两种变体上调用。两者都不是更好的选择,因此您会因含糊不清而出现错误。如果添加第三个函数 ,foo (const int&)所有调用都会不明确。但所有这些仍然是彼此的重载,并且不冲突。

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