C 中的以下代码是否具有定义的行为?
int main() {
const int i = 0;
return *(int*)(&i);
}
我问是因为 6.5/7 将“与对象的有效类型兼容的类型的限定版本”列为有效别名。但是对象的有效类型是const int
,而且我不认为int
它是一个合格的版本const int
(尽管反过来也是如此)。int
两者都不const int
兼容(6.7.3/10)。
此外,6.3.2.3/2 表示您可以通过添加限定符来转换指针类型,并且生成的指针是相等的。6.3.2.3/7 说您可以转换任何两种指针类型(因此(int*)(&i)
允许转换本身)。但并不是说结果指针指向同一个对象,甚至是相等的。它所说的只是它可以转换回原始类型(在这种情况下const int*
)。也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向i
.
那么,标准是否真的定义了我的代码的行为,如果是的话,它在哪里定义?
我知道代码在实践中有效。我想到了一个假设的(和奇怪的)实现,它不起作用。我可以询问该实现是否符合标准(如果不符合,它违反了哪一部分),但如果我想象的实现在其他方面不符合,我不想混淆。如果有人认为它会帮助他们回答问题,我将描述实现。