Bel*_*loc 24 c++ enums language-lawyer c++11 c++14
GCC 4.9.2不编译此代码段,但是clang 3.5.0可以编译.哪一个是正确的?
enum F : int { x, y, z};
int F;
enum F:int f = F::x;
Run Code Online (Sandbox Code Playgroud)
GCC输出:
main.cpp:3:12: error: expected ';' or '{' before 'f'
enum F:int f = F::x;
^
main.cpp:3:12: error: expected class-key before 'f'
main.cpp:3:14: error: invalid type in declaration before '=' token
enum F:int f = F::x;
^
main.cpp:3:16: error: 'F' is not a class, namespace, or enumeration
enum F:int f = F::x;
^
Run Code Online (Sandbox Code Playgroud)
我相信GCC是正确的,因为一个简单声明(包含精心设计的类型说明符enum F)不允许使用enum-base(: int),但我想对此进行一些确认.
Bar*_*rry 19
我相信gcc是正确的.如果我们查看[dcl.enum]中的语法规则,那么类型说明符包含:
enum-base:
:type-specifier-seq
包含枚举的令牌是:
枚举说明符:
枚举头{枚举-listopt}
枚举头{枚举列表,}
枚举头:
枚举密钥 属性说明符-seqopt identifieropt 枚举baseopt
枚举密钥 属性说明符-seqopt 嵌套名称说明符 标识符 枚举baseopt
和
opaque-enum-declaration:
enum-key attribute-specifier-seqopt identifier enum-baseopt;
这个表达式:
enum F:int f = F::x;
Run Code Online (Sandbox Code Playgroud)
既不是枚举说明符(不{}存在)也不是不透明枚举声明(其中类型说明符将立即跟随a ;).因为它不是C++语法,所以它不是一个有效的表达式.
asc*_*ler 13
你的推理是正确的.类似于" " 的枚举基词: int在语法上只允许在enum-specifier中使用,它必须包含一个{括号内}的枚举器列表,或者在一个opaque-enum-declaration中,它必须跟随enum-base并使用一个立即分号;.