算术类型的合格版本

时间:2019-03-27 16:25:04

标签: c language-lawyer

这似乎很明显,但是我不明白是否可以将合格类型的算术类型视为算术类型。 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 个答案:

答案 0 :(得分:5)

当我阅读C11的n1570草案或C99的n1256草案时,您提取第一条引文的完整段落是(强调我的):

  

§26到目前为止提到的任何类型都是不合格的类型。 每个不合格的类型都有几个   类型的合格版本,对应于一个,两个或全部的组合   const,volatile和strict限定符中的三个。合格或不合格   类型的版本是属于同一类型类别的不同类型,并且具有   相同的表示和对齐要求。派生类型不符合   派生类型的限定词(如果有)。

我对整段内容的理解是,尽管类型不同,但非限定类型的限定版本共享所有其他属性。因此const int是算术类型,也是整数类型。

此外,6.7.3语义第3节说:

  

与限定类型关联的属性仅对以下表达式有意义   是左值。

这意味着对两个合格的const int进行的操作产生的结果是不合格的int,因为它是一个右值。

限定符 modify 与左值访问相关的属性的非限定类型。类型不同是因为它们具有不同的访问属性,并且那些合格属性的详细信息在6.7.3类型限定符中给出。它们必须是不同的类型,因为指向限定类型​​(派生类型)的指针必须是不同的类型。但这与算术类型不是算术类型的合格版本无关。