[1747] Re:Cにおける列挙型の扱いについて
投稿者:774RR
2011/10/10 12:54:21
以下 JIS X3010:2003 より抜粋するので C の場合に限定
6.7.2.2 - 列挙型 - 列挙子並びの中の識別子は、型 int を持つ定数として宣言され、
この型の定数が許されるところならばどこに現れてもよい
なので元ネタのキャストは要らないと判断してよさそうです。
enum e_aaa 型の underlying type は char であってもよい、のと、
その要素である aaa の型は int である、のとが矛盾してるように見えますが・・・
# 集合論的におかしい
enum 型の識別子ではなくて enum 型の変数(オブジェクト)が現れた場合には
6.2.5 - 型 - 列挙体は[整数型]である
6.3.1.1 - 整数型 - 整数拡張 元の型のすべての値が int 型で表現可能な場合 int 型に変換される
6.7.2.2 - 列挙型 - 列挙定数の (既述につき snip)
となり、やはり int となるため問題ないです。
6.7.2.2 の[制約]は[定数の値を定義する式]としか書いてないので、
enum e_bbb { bbb=2147483647, ccc }; は言語規格書的には合法と考えざるを得ません。
# gcc ではきっちりコンパイルエラーになりますが。
C++ の場合はこの辺いろいろ規制緩和されている+言語仕様も厳密化されているので
仕様書を読んでいて安心できます。先の [制約] のような不安要素も文書化され済み。