p3 e p4 sono perfettamente inequivocabili e distinguibili, p1 e p2 no. (E ovviamente p1/p2 sono distinguibili da p3 e p4.)
Il motivo è che il livello superiore const
su un parametro di valore non è rilevabile e quindi inutile in una dichiarazione. È possibile ad esempio effettuare le seguenti operazioni:
void foo(int x); // declaration
// ...
void foo(const int x){
// definition/implementation
}
Il const
qui è un dettaglio di implementazione che non è importante per il chiamante, dal momento che si crea una copia in ogni modo. Quella copia è anche la ragione per cui non è distinguibile dal solo int
, dal lato del chiamante è lo esattamente lo stesso.
Si noti che const int& r
non ha un livello superiore const
, è il riferimento che fa riferimento a un numero intero costante (i riferimenti sono sempre costanti). Per i puntatori, che possono essere modificati se non dichiarati const
, vedere anche this question per dove inserire const
.