p3 и p4 являются абсолютно однозначными и различимыми, p1 и p2 - нет. (И, конечно, p1/p2 отличны от p3 и p4.)
Причина в том, что верхний уровень const
по параметру значения не обнаруживается и бесполезен в объявлении. Например, вы можете сделать следующее:
void foo(int x); // declaration
// ...
void foo(const int x){
// definition/implementation
}
const
здесь является деталью реализации, что не важно для вызывающего абонента, так как вы делаете копию в любом случае. Эта копия также является причиной того, что она не отличается от int
, со стороны абонентов это точно так же.
Обратите внимание, что const int& r
не имеет верхнего уровня const
, это ссылка, которая ссылается на постоянное целое число (ссылки всегда постоянны). Для указателей, которые могут быть изменены, если не объявлены const
, см. Также this question, где положить const
.