但是,下面的代码编译正确
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; }
为什么即使不知道它将被使用,编译器也不会禁用它?
问题与歧义有关.虽然f(1)只能在一个变体上调用,但f(i)可以在两者上调用.两者都不可取,因此您会出现歧义错误.如果添加了第三个函数foo(const int&),则所有调用都是不明确的.但是所有这些仍然是彼此的重载,并且没有冲突.
我同意能够有一个函数的三个重载并且能够直接调用none是很奇怪的.也许其他人有更多要补充.