从指向const的指针中删除const是否遵循C中的严格别名,并引用相同的对象?

C中的以下代码是否定义了行为?

int main() { const int i = 0; return *(int*)(&i); } 

我问因为6.5 / 7列出了“与对象的有效类型兼容的类型的合格版本”作为有效别名。 但是对象的有效类型是const int ,我不认为intconst int的限定版本(尽管反之亦然)。 intconst int都不兼容(6.7.3 / 10)。

此外,6.3.2.3 / 2表示您可以通过添加限定符来转换指针类型,并且结果指针是相等的。 6.3.2.3/7表示你可以转换任何两种指针类型(因此允许使用cast (int*)(&i)本身)。 但是并没有说结果指针指的是同一个对象,甚至它是相等的。 它说的是它可以转换回原始类型(在本例中为const int* )。 也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向i的指针。

那么,标准是否实际上定义了我的代码的行为,如果是这样,这个定义在哪里?

我知道代码在实践中有效。 我想到了一个假设的(和奇怪的)实现,它不起作用。 我可以问这个实现是否符合标准(如果没有,它违反了哪个部分),但如果还有其他方面,我想象的实现无法符合,我不想浑水。 如果有人认为这将有助于他们回答问题,我将描述实施。

根据§6.7.3p5,至少暗示它是有效的:

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。 如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为未定义。

请注意,对于volatile 引用的类型,它表示引用 ,但对于const限定类型,它只是说修改 ,这意味着非修改访问是正常的( “certificate规则的例外 ”)。

不过,在我看来,你可能已经发现了标准中的缺陷。