这似乎很明显,但我不明白我们是否可以将算术类型的合格版本视为算术类型。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;
发布于 2019-03-27 17:31:38
当我阅读“n1570 C11草案”或“n1256 C99草案”时,从其中提取第一个引文的完整段落是(强调我的):
§26迄今为止提到的任何类型都是不合格的类型。每个不合格类型都有其类型的几个限定版本,对应于一个、两个或全部三个const、several和限制限定符的组合。类型的限定或非限定版本是属于同一类型类别的不同类型,并且具有相同的表示形式和对齐要求。派生类型不受派生类型的限定符(如果有的话)限定。
我对整个段落的理解是,尽管类型不同,但非限定类型的限定版本共享所有其他属性。因此,const int
是算术类型,也是整数类型。
此外,6.7.3语义学第3节说:
与限定类型关联的属性仅对属于lvalue的表达式有意义。
这意味着对两个限定const int
的操作会产生一个不合格的int
结果,因为它是一个rvalue。
这些限定符只修改与lvalue访问相关的属性的非限定类型。它们是不同的类型,因为它们具有不同的访问属性,这些限定属性的详细信息在6.7.3 Type限定符中给出。它们必须是不同的类型,因为指向限定类型(派生类型)的指针必须是不同的类型。但这与算术类型的限定版本无关,而不是算术类型。
https://stackoverflow.com/questions/55382078
复制相似问题