2010-11-05 74 views
6

!免責聲明!:請注意,我正在談論未標記的聲明。我知道這可能是一個非正式的術語,我的意思是說聲明不是一個typedef,它不聲明匿名類型的對象。在這些情況下,一切都很清楚。匿名空untagged類,結構,聯盟和枚舉

問題1:
其下面的是一合式的C++程序? (可多選)

//One 
int main(){ 
    struct{}; //or class{}; should be the same 
} 
//Two 
int main(){ 
    enum{}; 
} 
//Three 
int main(){ 
    union{}; 
} 

備註:
MSVC9.0接受所有三個。第一,它發出警告。在二號和三號我們得到0個錯誤和0個警告。在線新秀只接受第三名,第一名和第二名未能通過診斷消息進行編譯,「聲明沒有聲明任何內容」。如果在第二位,匿名枚舉至少包含一個枚舉器,則第二位被comeau編譯器正確接受。

如果comeau編譯器是正確的,並且這是標準行爲,那麼我看到它有一些不一致。我能理解爲什麼第一應該被拒絕。我也理解爲什麼第二位應該被拒絕(沒有聲明),但在這種情況下,第三位也應該被拒絕。如果不應該拒絕第三名,那麼我認爲唯一的區別就是,一個有害聯盟的成員範圍是外部範圍。但是枚舉也是如此,所以,我的觀點是,如果第三位被接受,那麼第二位應該被接受。

問題2:
如果科莫是正確的,我在我的上述判斷缺什麼考慮?

附:我寫了一封電子郵件給comeau支持。我會盡快發佈答案。

回答

3

沒有一個是合法的。參見[dcl.dcl]第3段。