算术类型的合格版本

Som*_*ame 0 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;  
Run Code Online (Sandbox Code Playgroud)

Ser*_*sta 5

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

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

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

此外,6.7.3语义第3节说:

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

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

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