Я получил ответ Нет! Поскольку передача значением и передача ссылочными взглядами, идентичными вызывающей стороне.
Однако код ниже права компиляций
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 &)
, , все вызовы будут неоднозначными. Но все они по-прежнему являются перегрузками друг друга и не противоречат друг другу.
Я согласен, что странно иметь три перегрузки функции и не вызывать ни одной напрямую. Возможно, у кого-то еще есть что добавить.
Вы можете вызвать каждый метод:
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)