Нет никаких оснований запрещать квалификаторы для параметров функции в объявлениях без определения, и это позволяет исходному коду сохранять идентичные объявления как в определении, так и в любых объявлениях без определения.
В определенииconst
и другие квалификаторы имеют свои обычные эффекты, например:
int foo(const int x)
{
x = 3; // Not permitted.
}
Предполагая, что мы не хотим потерять это поведение, разрешение классификаторов в определениях и запрет их в объявлениях, которые не являются объявлениями, излишне усложнитстандарт.Кроме того, это означает, что люди, которые скопировали определение, чтобы вставить его в другое место в качестве объявления без определения, должны будут внести дополнительные изменения, и любое программное обеспечение, предназначенное для сбора внешних определений из исходного файла, для создания заголовочного файла, содержащего объявления без определения, будет иметьвыполнить дополнительный анализ и манипулирование для удаления квалификаторов (но только для квалификаторов верхнего уровня, а не для внутренних типов, таких как int * const p
).
Как правило, язык C и C ++ не запрещает «бесполезные» вещинапример, добавление постоянного нуля (который может возникнуть в результате сочетания макросов препроцессора, когда какое-либо выражение оказывается равным нулю при определенных выборках параметров сборки), изолированные пустые операторы и т. д.Эти вещи не вызывают беспокойства, если они не способствуют человеческой склонности к ошибкам.Например, если добавление нуля всегда происходило в результате ошибки (так как это никогда не происходило как следствие, такое как упомянуто выше), то запрещение этого может иметь значение.Однако, если нет никакого смысла запрещать что-либо, то затрачивать усилия на запрещение чего-либо бесполезно.