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

StackOverflow https://stackoverflow.com/questions/2458090

Вопрос

Я получил ответ НЕТ!Потому что передача по значению и передача по ссылке выглядят одинаково для вызывающего объекта.

Однако приведенный ниже код компилируется правильно

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top