GCC拒绝使用enum-base进行简单声明; clang接受了 - 这是正确的吗?

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并使用一个立即分号;.