Podemos sobrecarregar uma função com base apenas se um parâmetro é um valor ou uma referência?
-
20-09-2019 - |
Pergunta
Eu tenho a resposta não! Porque passar pelo valor e passar por referência parece idêntico ao chamador.
No entanto, o código abaixo compila certo
class A {
public:
void f(int i) {}
void f(int& i) {}
};
Mas quando tento usá -lo, há um erro de compilação.
int main () {
A a;
int i = 9;
int& j = i;
a.f(1);
a.f(i);
a.f(j);
return 0;
}
Por que o compilador não o desativa, mesmo sem saber que será usado?
Solução
Sim, eles podem ser sobrecarregados com base na referência ou não. É por isso que é perfeitamente bom tê -los coexistem assim; Eles são diferentes.
O problema tem a ver com ambiguidade. Enquanto f(1)
só pode ser chamado em uma variação, f(i)
pode ser chamado em ambos. Nem é preferível, portanto, você recebe um erro de ambiguidade. Se você adicionou uma terceira função, foo (const int&)
, tudo As chamadas seriam ambíguas. Mas todos ainda são sobrecargas um do outro e não conflitando.
Concordo que é estranho poder ter três sobrecargas de uma função e ser capaz de chamar diretamente de nenhuma. Talvez alguém tenha mais a acrescentar.
Outras dicas
Você pode ligar para cada método:
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)