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