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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top