14

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.

那么,标准是否真的定义了我的代码的行为,如果是的话,它在哪里定义?

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

4

1 回答 1

8

§6.7.3 p5至少暗示它可以工作:

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

请注意,对于 volatile 限定的类型,它说的是 refer,但对于 const 限定的类型,它只是说modify,这意味着非修改访问是可以的(“证明规则的异常”)。

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

于 2013-01-21T11:49:09.503 回答