Podemos sobrecarga de una función basada en solamente si un parámetro es un valor o una referencia?

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

Pregunta

Tengo la respuesta NO! Debido a que pasa por su valor y que pasa por referencia parece idéntica a la persona que llama.

Sin embargo, el código de abajo compila la derecha

class A {

public:
void f(int i) {}    

void f(int& i) {}
};

Pero cuando trato de usarlo, no hay error de compilación.

int main () {

   A a;
   int i = 9;
   int& j = i;
   a.f(1);
   a.f(i);
   a.f(j);
  return 0;
}

¿Por qué no el compilador desactivarlo incluso sin saber que va a ser utilizado?

¿Fue útil?

Solución

Sí, se puede sobrecargar basado en la referencia o no. Por eso es perfectamente posible hacer que coexisten como esa; que son diferentes.

El problema tiene que ver con la ambigüedad. Mientras f(1) sólo puede ser llamado en una variación, f(i) puede ser llamado en ambos. Ninguno de los dos es preferible, por lo tanto, se produce un error de ambigüedad. Si ha añadido una tercera función, foo (const int&), todos llamadas serían ambiguas. Pero todos son todavía sobrecargas de uno al otro, y no conflictivos.

Estoy de acuerdo que es extraño a ser capaz de tener tres sobrecargas de una función, y ser capaz de llamar directamente a ninguno. Tal vez alguien más tiene más que añadir.

Otros consejos

Puede llamar a 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top