매개 변수가 값인지 참조인지에 따라 함수를 과부하 할 수 있습니까?
-
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&)
, 모두 전화는 모호합니다. 그러나 모두는 여전히 서로의 과부하와 비 분쇄입니다.
나는 3 개의 과부하의 함수를 가질 수 있고 직접 전화 할 수 있다는 것이 이상하다는 데 동의합니다. 아마도 다른 사람이 추가해야 할 것이 더 많을 것입니다.
다른 팁
각 방법을 호출 할 수 있습니다.
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)
제휴하지 않습니다 StackOverflow