В подобных случаях допускается исключение спецификатора const из объявления , поскольку он ничего не меняет для вызывающей стороны.
Это имеет значение только для контекста деталей реализации. Так вот почему это определение , но не объявление .
Пример:
//Both f and g have the same signature
void f(int x);
void g(const int x);
void f(const int x)//this is allowed
{
}
void g(const int x)
{
}
Любой, кто вызывает f, не будет заботиться о том, что вы будете рассматривать его как const, потому что это ваша собственная копия переменной.
С int * const x, это то же самое, это ваша копия указателя. Можете ли вы указать на что-то еще, для звонящего не имеет значения.
Если вы опустите первый const, хотя в const int * const, то это будет иметь значение, поскольку для вызывающего абонента будет важно, если вы измените данные, на которые он указывает.
Ссылка: Стандарт C ++ , 8.3.5 пункт 3:
"Любой cv-квалификатор, модифицирующий
тип параметра удален ... такой
cv-квалификаторы влияют только на
определение параметра с
тело функции; они не
влияет на тип функции "