这似乎很明显,但是我不明白是否可以将合格类型的算术类型视为算术类型。 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;
答案 0 :(得分:5)
当我阅读C11的n1570草案或C99的n1256草案时,您提取第一条引文的完整段落是(强调我的):
§26到目前为止提到的任何类型都是不合格的类型。 每个不合格的类型都有几个 类型的合格版本,对应于一个,两个或全部的组合 const,volatile和strict限定符中的三个。合格或不合格 类型的版本是属于同一类型类别的不同类型,并且具有 相同的表示和对齐要求。派生类型不符合 派生类型的限定词(如果有)。
我对整段内容的理解是,尽管类型不同,但非限定类型的限定版本共享所有其他属性。因此const int
是算术类型,也是整数类型。
此外,6.7.3语义第3节说:
与限定类型关联的属性仅对以下表达式有意义 是左值。
这意味着对两个合格的const int
进行的操作产生的结果是不合格的int
,因为它是一个右值。
限定符仅 modify 与左值访问相关的属性的非限定类型。类型不同是因为它们具有不同的访问属性,并且那些合格属性的详细信息在6.7.3类型限定符中给出。它们必须是不同的类型,因为指向限定类型(派生类型)的指针必须是不同的类型。但这与算术类型不是算术类型的合格版本无关。