Когда я читаю черновик n1570 для C11 или черновик n1256 для C99, полный абзац, из которого вы извлекли свою первую цитату, (выделите мою):
§26. Любой тип, упомянутый до сих пор, является неквалифицированным типом. Каждый неквалифицированный тип имеет несколько
квалифицированные версии его типа , соответствующие комбинациям один, два или все
три из const, volatile и restrict квалификаторов. Квалифицированный или неквалифицированный
версии типа являются различными типами, которые принадлежат к той же категории типов и имеют
одинаковые требования к представлению и выравниванию. Производный тип не квалифицирован
квалификаторы (если есть) того типа, из которого они получены.
Насколько я понимаю, полный абзац состоит в том, что, несмотря на то, что это разные типы, квалифицированные версии неквалифицированного типа имеют все остальные свойства. Итак, const int
- это арифметический тип и целочисленный тип.
Кроме того, 6.7.3 Семантика §3 говорит:
Свойства, связанные с квалифицированными типами, имеют смысл только для выражений, которые
lvalues.
Это означает, что операция над двумя квалифицированными const int
дает результат, который является неквалифицированным int
, потому что это значение.
Квалификаторы только изменяют неквалифицированный тип для свойств, связанных с доступом к lvalue. Это разные типы, потому что они имеют разные свойства доступа, а подробности об этих квалифицированных свойствах приведены в 6.7.3. Они должны быть разных типов, потому что указатели на квалифицированные типы, которые являются производными типами, должны быть разных типов. Но это не имеет ничего общего с квалифицированными версиями арифметических типов, не являющимися арифметическими типами.