2011-06-29 28 views
5

我見過several assertions是C89和C++ 03定義嚴格別名規則。但是,我無法在標準中找到那個特定的位。我的理解是C99中增加了嚴格的別名規則。待辦事項C89或C++ 03定義嚴格別名規則?

+1

我引用了C++ 03 3.10/15的全部內容,其中列出了有效形式的別名,[在另一個問題的答案](http://stackoverflow.com/questions/4807643/container-covariance-in -c/4807726#4807726)。 –

回答

5

的C++ 03標準具有以下下§3.10 [basic.lval] p15

如果一個程序試圖通過其它的左值比以下類型之一來訪問對象的存儲值的行爲是未定義48)
- 動態類型的對象,
- 動態類型的對象的CV-合格版本,
- 一個類型在所述簽名或對應於動態型的對象的無符號類型,
- 與對象的動態類型的cv限定版本對應的有符號或無符號類型的類型,
- 在其成員中包括上述類型之一的聚合或聯合類型(包括遞歸,a成員的子集或包含的聯合),
- 類型是(可能是cv合格的)基類類型的對象的動態類型,
- char或unsigned char類型。

腳註:

48)該列表的目的是,以指定的對象可以或可以不被混疊的那些情況。

This site也列出了其他標準中的部分。

+0

檢查這是因爲我明確地選擇了問題中的答案。 –

5

本文存在於C89,§3.3表達式:

一個目的應具有其存儲 值僅由左值訪問的 有以下幾種類型中的一種:

  • 對象的聲明類型,

  • 合格版本的聲明 類型的對象,

  • 一個類型在所述簽名或相應於
    聲明類型對象的 無符號類型,

  • 在所述簽名或相應於一個
    合格版本 無符號類型的類型聲明類型對象的 ,

  • 的聚集或聯合類型 包括前述
    之一其成員之間的類型(包括, 遞歸,一個
    子聚集的成員或包含聯合),或

  • 字符類型。

違反「應」約束導致未定義行爲,所以一組允許的別名規則可以從這個文本導出。

5

3.3 C89,3.10/15在C++ 03。

兩者有一個腳註,話,效果「此列表的意圖是表示當物體可能會或可能不會被混疊」。

+0

愚蠢的CTRL-F! (我搜索了「別名」一詞!誠實!) –