Стандарт говорит в 8.3.5 / 3, что для целей определения типа функции все cv-квалификаторы, которые непосредственно определяют тип параметра, удаляются. То есть буквально говорится, что функция объявлена как
void foo(int *const a);
имеет тип функции void (int *)
.
Педантист может утверждать, что это недостаточно убедительно, чтобы утверждать, что приведенная выше декларация должна соответствовать определению, подобному этому
void foo(int *a)
{
}
или что он должен сделать код с двойным объявлением (как в вашем примере) некорректным, поскольку ни одна из этих концепций не описана в стандарте в терминах типов функций .
Я имею в виду, мы все знаем, что эти const
были предназначены для игнорирования во всех внешних целях, но до сих пор я не смог найти формулировку в стандарте, которая бы точно указала это. Может быть, я что-то пропустил.
На самом деле, в 13.1 / 3 имеется «Примечание», в котором говорится, что объявления функций с эквивалентными объявлениями параметров (как определено в 8.3.5) объявляют такую же функцию . Но это просто примечание, оно ненормативное, что предполагает, что где-то в стандарте должен быть какой-то нормативный текст по тому же вопросу.