【问题标题】:Can we overload a function based on only whether a parameter is a value or a reference?我们可以仅根据参数是值还是引用来重载函数吗?
【发布时间】:2011-01-28 07:44:27
【问题描述】:

我的答案是不!因为按值传递和按引用传递看起来与调用者相同。

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

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

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

【问题讨论】:

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


【解决方案1】:

你可以调用每个方法:

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)

【讨论】:

  • (a.*f)(i); 应该足够了。
  • 你的意思可能是 (a.*t)(i); (不是(a.*f))
  • 是的,我已经确定了我要添加的内容。
  • 你能解释一下吗?
  • @ShivanshJagga :仅声明一个指向成员函数的指针,该函数引用 int(并返回 void)。然后通过指针调用方法--- (a.*t)(i);
【解决方案2】:

是的,它们可以根据引用重载或不重载。这就是为什么让它们像这样共存是完全可以的。它们是不同的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多