2012-04-12 23 views
5

Ich mag würde wissen, warum diese Erklärungen nicht funktionieren (nicht kompatibel)mehrdeutige Funktionen in C++

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

Wenn ich gut verstanden, wird der Compiler keinen Unterschied zwischen (int &) finden und (const int &) und wenn ich f (12) schreibe es wird nicht in der Lage sein zwischen den beiden ersten Deklarationen zu wählen .. Bin ich richtig?

Antwort

7

p3 und p4 sind vollkommen eindeutig und unterscheidbar, p1 und p2 nicht. (Und natürlich sind p1/p2 von p3 und p4 unterscheidbar.)

Der Grund ist, dass die oberste Ebene const für einen Wertparameter nicht nachweisbar und auf einer Deklaration tatsächlich nutzlos ist. Sie können beispielsweise wie folgt vor:

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

Die const hier ist eine Implementierung Detail, das für den Anrufer nicht wichtig ist, da man sowieso eine Kopie. Diese Kopie ist auch der Grund, warum es nicht nur von int zu unterscheiden ist, von der Anruferseite ist es genau das gleiche.

Beachten Sie, dass const int& r keine Top-Level const hat, es ist die Referenz, die sich auf eine konstante Ganzzahl bezieht (Referenzen sind immer konstant). Für Zeiger, die geändert werden können, wenn sie nicht const deklariert werden, siehe auch this question wo Sie const setzen können.