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.