Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC拒绝使用枚举基的简单声明;clang接受了它—;哪个是正确的?_C++_C++11_Enums_Language Lawyer_C++14 - Fatal编程技术网

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:你不能修改整个世界:-(…至少不是每天都这样!(但抱怨它很便宜。)