Действительно ли мы можем перегрузить функцию на основе только, является ли параметр значением или ссылкой?

Я получил ответ Нет! Поскольку передача значением и передача ссылочными взглядами, идентичными вызывающей стороне.

Однако код ниже права компиляций

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

Почему компилятор не отключает его даже, не зная, что это будет используемым?

7
задан Peter Alexander 16 March 2010 в 21:04
поделиться

2 ответа

Да, они могут быть перегружены на основании ссылки или нет. Вот почему вполне нормально, когда они вот так сосуществуют; они разные.

Проблема связана с двусмысленностью. В то время как f (1) может быть вызван только в одном варианте, f (i) может быть вызван в обоих. Ни то, ни другое не является предпочтительным, поэтому вы получите ошибку из-за двусмысленности. Если вы добавите третью функцию, foo (const int &) , , все вызовы будут неоднозначными. Но все они по-прежнему являются перегрузками друг друга и не противоречат друг другу.

Я согласен, что странно иметь три перегрузки функции и не вызывать ни одной напрямую. Возможно, у кого-то еще есть что добавить.

3
ответ дан 6 December 2019 в 21:12
поделиться

Вы можете вызвать каждый метод:

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)
9
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: