2012-04-12 16 views
5

Me gustaría saber por qué estas declaraciones no funcionarán (no son compatibles)funciones ambiguas en C++

void f(int); //p1 
void f(const int);//p2 
void f(int &);//p3 
void f(const int &);//p4 

Si he entendido bien, el compilador no encontrar una diferencia entre (int &) y (const int &) y si escribo f (12) no podrá elegir entre las dos primeras declaraciones .. ¿Estoy en lo cierto?

Respuesta

7

p3 y p4 son perfectamente no ambiguos y distinguibles, p1 y p2 no lo son. (Y por supuesto p1/p2 son distinguibles de p3 y p4.)

La razón es que el nivel superior const en un parámetro de valor no es detectable y de hecho inútil en una declaración. Por ejemplo, puede hacer lo siguiente:

void foo(int x); // declaration 
// ... 
void foo(const int x){ 
    // definition/implementation 
} 

El const aquí es un detalle de implementación que no es importante para la persona que llama, ya que se hace una copia de todos modos. Esa copia es también la razón por la que no se distingue de int, del lado de las personas que llaman es exactamente el mismo.

Tenga en cuenta que const int& r no tiene un nivel superior const, es la referencia que hace referencia a un entero constante (las referencias son siempre constantes). Para los punteros, que pueden cambiarse si no se declara const, consulte también this question para saber dónde poner const.