C語言中的以下代碼是否具有已定義的行爲?從const指針中刪除const是否遵守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
的指針。
那麼,標準實際上是否定義了我的代碼的行爲,如果是這樣定義的呢?
我知道代碼在實踐中的作品。我想到了一個假想的(和奇怪的)實現,它不起作用。我可以問這個實現是否符合標準(如果沒有,它違反了什麼部分),但是如果我的想象實現不符合其他方面,我不想渾水。如果有人認爲它會幫助他們回答這個問題,我會描述實施情況。
對於轉換回int const *標準清楚地表明結果必須是標識。 「否則,當再次轉換時,結果應與原始指針相等。」 –
@JensGustedt:同意。這對我的代碼沒有幫助,因爲我的代碼永遠不會將它轉換回'int const *'。 –