C ++ 11作用域枚举中允许的枚举器初始化器类型是什么?

时间:2016-03-10 00:27:54

标签: c++11 gcc enums clang language-lawyer

以下代码compiles cleanly与GCC 5.2.1

enum class some_enum
{
    first = static_cast<some_enum>(1),
};

但是clang 3.6.2中的fails

$ clang++ -std=c++11 enum.cpp  -c
enum.cpp:15:13: error: value of type 'some_enum' is not implicitly convertible to 'int'
    first = static_cast<some_enum>(1),
            ^~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

根据我对标准的解读(第7.2节,第5段),枚举器初始值设定项表达式必须与枚举的基础类型相同。恰好是int,而不是some_enum

所以我觉得clang拒绝这个是正确的,这是GCC中的一个错误。在我向GCC报告这个错误之前,能否更好地理解标准的人能够确认吗?

编辑:解释有关标准的推理

以下是我对7.2第5段的理解:

Each enumeration defines a type that is different from all other
types. Each enumeration also has an underlying type. The underlying
type can be explicitly specified using enum-base; if not explicitly
specified, the underlying type of a scoped enumeration type is int. In
these cases, the underlying type is said to be fixed.

因此,由于这是一个没有显式枚举的带范围枚举,因此其基础类型已修复int

Following the closing brace of an enum-specifier, each enumerator
has the type of its enumeration.

换句话说,在enum主体之外,单个枚举器(即枚举中的命名条目)与整个enum具有相同的类型。

If the underlying type is fixed, the type of each enumerator prior to
the closing brace is the underlying type...

由于我们正在处理始终具有固定基础类型的作用域枚举,因此枚举主体中内的每个枚举条目的类型与枚举的基础类型具有相同的类型。在这种情况下,在正文中,枚举数的类型为int

...and the constant-expression in the enumerator-definition shall
be a converted constant expression of the underlying type (5.19);
if the initializing value of an enumerator cannot be represented
by the underlying type, the program is ill-formed.

在示例中,初始化程序的类型为some_enum,如果没有显式转换,则无法将C ++ 11作用域枚举转换为基础类型的常量表达式。所以该计划形成不良。

0 个答案:

没有答案