Квалифицированная версия арифметических типов - PullRequest
0 голосов
/ 27 марта 2019

Это кажется очевидным, но я не мог понять, можем ли мы рассматривать квалифицированную версию арифметического типа как арифметический тип.int - это арифметический тип.volatile const int арифметика?6.2.5(p26):

Квалифицированные или неквалифицированные версии типа - это отдельные типы, принадлежащие к одной категории типов и имеющие одинаковые требования к представлению и выравниванию.

определение категории типа 6.2.5(p25):

Тип характеризуется его категорией типа, которая является либо самым внешним производным производного типа (как отмечено выше при построении производных типов), либовведите сам тип, если тип не состоит из производных типов

Таким образом, категория типа имеет значение, если тип является указателем / массивом / функцией и не имеет ничего общего с "арифметикой" типа.

Определение арифметических типов, данное ранее в 6.2.5(p18).Поэтому, применяя только те правила, которые я привел, и определение, данное в 6.2.5(p18), невозможно утверждать, что const volatile int также является арифметическим.

Те же требования к представлению и выравниванию, что и для арифметического типа, не делают тип арифметическим..

Вопрос возник, когда я попытался понять, как использовать оператор присваивания 6.5.16.1(p1):

левый операнд имеет атомарный, квалифицированный или неквалифицированный арифметический тип, а правый имеетарифметический тип

const int a = 10;
//Do I really need this cast to make it arithmetic?
//Looks crazy
const int b = (int) a;  

1 Ответ

5 голосов
/ 27 марта 2019

Когда я читаю черновик n1570 для C11 или черновик n1256 для C99, полный абзац, из которого вы извлекли свою первую цитату, (выделите мою):

§26. Любой тип, упомянутый до сих пор, является неквалифицированным типом. Каждый неквалифицированный тип имеет несколько квалифицированные версии его типа , соответствующие комбинациям один, два или все три из const, volatile и restrict квалификаторов. Квалифицированный или неквалифицированный версии типа являются различными типами, которые принадлежат к той же категории типов и имеют одинаковые требования к представлению и выравниванию. Производный тип не квалифицирован квалификаторы (если есть) того типа, из которого они получены.

Насколько я понимаю, полный абзац состоит в том, что, несмотря на то, что это разные типы, квалифицированные версии неквалифицированного типа имеют все остальные свойства. Итак, const int - это арифметический тип и целочисленный тип.

Кроме того, 6.7.3 Семантика §3 говорит:

Свойства, связанные с квалифицированными типами, имеют смысл только для выражений, которые lvalues.

Это означает, что операция над двумя квалифицированными const int дает результат, который является неквалифицированным int, потому что это значение.

Квалификаторы только изменяют неквалифицированный тип для свойств, связанных с доступом к lvalue. Это разные типы, потому что они имеют разные свойства доступа, а подробности об этих квалифицированных свойствах приведены в 6.7.3. Они должны быть разных типов, потому что указатели на квалифицированные типы, которые являются производными типами, должны быть разных типов. Но это не имеет ничего общего с квалифицированными версиями арифметических типов, не являющимися арифметическими типами.

...