Поскольку для вызывающего нет никакой разницы, и нет четкого способа отличить вызов функции с параметром const верхнего уровня и без него, правила языка игнорируют consts верхнего уровня. Это означает, что эти два
void foo(const int);
void foo(int);
рассматриваются как одно и то же объявление. Если вы должны были предоставить две реализации, вы получите ошибку с множественным определением.
Существует различие в определении функции с верхним уровнем const. В одном вы можете изменить свою копию параметра. В другом вы не можете. Вы можете увидеть его как деталь реализации. Для вызывающего нет никакой разницы.
// declarations
void foo(int);
void bar(int);
// definitions
void foo(int n)
{
n++;
std::cout << n << std::endl;
}
void bar(const int n)
{
n++; // ERROR!
std::cout << n << std::endl;
}
Это аналогично следующему:
void foo()
{
int = 42;
n++;
std::cout << n << std::endl;
}
void bar()
{
const int n = 42;
n++; // ERROR!
std::cout << n << std::endl;
}