C 有效类型的限定符有哪些规则?

C 有效类型的限定符有哪些规则?,c,language-lawyer,lvalue,strict-aliasing,c17,C,Language Lawyer,Lvalue,Strict Aliasing,C17,所以我重新阅读了C17 6.5/6-6.5/7中关于有效类型和严格别名的内容,但不知道如何处理限定符。有些事情让我困惑: 我一直认为限定符与有效类型并不相关,因为规则谈到左值访问,这意味着丢弃限定符的左值转换。但是如果对象是指针呢?指向指向数据的限定符不受左值转换的影响 Q1:如果有效类型是指向限定类型的指针怎么办?我是否可以将其作为指向同一类型的非限定指针进行左值访问?本标准中的何处规定了这一点 在这些情况下,严格别名规则的例外情况提到了限定符: -与对象的有效类型兼容的类型的限定版本,

所以我重新阅读了C17 6.5/6-6.5/7中关于有效类型和严格别名的内容,但不知道如何处理限定符。有些事情让我困惑:

  • 我一直认为限定符与有效类型并不相关,因为规则谈到左值访问,这意味着丢弃限定符的左值转换。但是如果对象是指针呢?指向指向数据的限定符不受左值转换的影响

    Q1:如果有效类型是指向限定类型的指针怎么办?我是否可以将其作为指向同一类型的非限定指针进行左值访问?本标准中的何处规定了这一点

  • 在这些情况下,严格别名规则的例外情况提到了限定符:

    -与对象的有效类型兼容的类型的限定版本,
    -一种类型,它是与数据的有效类型相对应的有符号或无符号类型 对象,
    -一种类型,它是与的限定版本相对应的有符号或无符号类型 对象的有效类型

    这些地址限定符本身都不是有效类型的,仅由用于访问的左值决定。这应该是不相关的,因为左值转换。。。对吧?

    Q2:左值转换是在应用上述有效类型/严格别名规则之前还是之后发生的

    Q3:有效类型是否带有限定符?本标准中的何处规定了这一点


我还感觉到有大量关于这些规则的缺陷报告。对于Q1,你是指类似于
void volatile*p
*(void**)&p=NULL
void volatile*p
*(void volatile*volatile*)&p=NULL将被允许?6.7.6.1指针声明符2:对于要兼容的两种指针类型,两者都应具有相同的合格性,并且都应是指向兼容类型的指针6.7.3类型限定符11:对于要兼容的两种合格类型,两者都应具有兼容类型的相同合格版本。因此
int*
const int*
不兼容,您无法访问一种类型的对象,而不是另一种类型的左值@是的。也就是说,(限定)指针本身的左值访问。@LanguageLawyer但严格的别名规则允许各种异常。您引用的部分大部分是我没有包含的第一个项目符号:“-与对象的有效类型兼容的类型”。我还感觉到有大量关于这些规则的缺陷报告。对于Q1,您是指类似于
void volatile*p
*(void**)&p=NULL
void volatile*p
*(void volatile*volatile*)&p=NULL将被允许?6.7.6.1指针声明符2:对于要兼容的两种指针类型,两者都应具有相同的合格性,并且都应是指向兼容类型的指针6.7.3类型限定符11:对于要兼容的两种合格类型,两者都应具有兼容类型的相同合格版本。因此
int*
const int*
不兼容,您无法访问一种类型的对象,而不是另一种类型的左值@是的。也就是说,(限定)指针本身的左值访问。@LanguageLawyer但严格的别名规则允许各种异常。您引用的部分大部分是我没有包含的第一个项目符号:“-与对象的有效类型兼容的类型”。