C++ GCC拒绝使用枚举基的简单声明;clang接受了它—;哪个是正确的?
不会编译此代码段,但会编译。哪一个是正确的C++ GCC拒绝使用枚举基的简单声明;clang接受了它—;哪个是正确的?,c++,c++11,enums,language-lawyer,c++14,C++,C++11,Enums,Language Lawyer,C++14,不会编译此代码段,但会编译。哪一个是正确的 enum F : int { x, y, z}; int F; enum F:int f = F::x; 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: inva
enum F : int { x, y, z};
int F;
enum F:int f = F::x;
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;
^
我相信GCC是正确的,因为一个简单的声明(包含详细的类型说明符
enum F
)不允许使用枚举基(:int
),但我希望对此进行一些确认。您的推理是正确的。语法上只允许在枚举说明符中使用类似“:int
”的枚举基,该说明符必须包含括在{
括号中的}
枚举数列表,或者在不透明的枚举声明中,该声明必须在枚举基后面加上立即分号代码>我相信gcc是正确的。如果我们查看[dcl.enum]中的语法规则,则类型说明符将附带:
枚举基:
:
类型说明符序列
包含枚举基的令牌包括:
枚举说明符:
枚举头{
枚举器列表选项}
枚举头{
枚举器列表,
}
枚举头:
枚举键属性说明符seqopt identifieropt枚举baseopt
枚举键属性说明符seqopt嵌套名称说明符标识符
枚举baseopt
及
不透明枚举声明:
枚举键属性说明符seqopt标识符enum baseopt代码>
这句话:
enum F:int f = F::x;
既不是枚举说明符(不存在{}
),也不是不透明的枚举声明(其中类型说明符后面紧跟着;
)。因为它不是在C++语法中,它不是一个有效的表达式。最不有用的问题标题:-我可以肯定的是,<代码> f>代码>不是<代码> EnUM类< /C> >所以<代码> f:x/c>无效。@使用作用域解析运算符不需要作用域枚举。@KerrekSB写评论的时间本可以花在修改标题上。@PeterSchneider:你不能修改整个世界:-(…至少不是每天都这样!(但抱怨它很便宜。)