6

!免責事項! :タグなし宣言について話していることに注意してください。私はそれがおそらく非公式の用語であることを知っています。それが意味することは、宣言が typedef ではなく、匿名型のオブジェクトを宣言しないということです。これらの場合、すべてが明確です。

質問 1:
次のうち、整形式の C++ プログラムはどれですか? (複数の選択肢)

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

備考:
MSVC9.0 は 3 つすべてを受け入れます。最初は警告が表示されます。2 番目と 3 番目では、0 個のエラーと 0 個の警告が表示されます。オンライン コモーは 3 番のみを受け入れ、1 番と 2 番はコンパイルに失敗し、「宣言は何も宣言しません」という診断メッセージが表示されます。2 番目の匿名列挙に少なくとも 1 つの列挙子が含まれている場合、2 番目は comeau コンパイラによって正しく受け入れられます。

comeau コンパイラが正しく、これが標準の動作である場合、矛盾が見られます。ナンバーワンが拒否されるべき理由は理解できます。2 番目を拒否する理由 (何も宣言しない) も理解できますが、この場合は 3 番目も拒否する必要があります。そして、3 番目が拒否されるべきではない場合、1 番目との唯一の違いは、無名共用体のメンバーのスコープが外側のスコープであることです。しかし、それは列挙型にも当てはまります。したがって、私の主張は、3 番目が受け入れられるべきであり、2 番目が受け入れられるべきであるということです。

質問 2:
コモーが正しい場合、上記の判断に欠けている考慮事項は何ですか?

PS comeau サポートにメールを書きました。回答が得られたらすぐに投稿します。

4

1 に答える 1

3

どれも合法ではありません。[dcl.dcl] パラグラフ 3 を参照してください。

于 2010-11-05T16:08:59.077 に答える