C++ 存储受限的枚举的开关中的类型转换失败

C++ 存储受限的枚举的开关中的类型转换失败,c++,g++,switch-statement,bit-fields,enum-class,C++,G++,Switch Statement,Bit Fields,Enum Class,: 产生错误: In function ‘int main()’: error: could not convert ‘yes’ from ‘confirm’ to ‘int’ case confirm::yes: ^ 虽然用g++编译,但用clang++编译得很好为什么标记为(2)可能但标记为(3)不可能的赋值 关于存储空间太小的警告属于这看起来像是一个gcc错误,我们可以看到它可以工作: 从草案C++11标准部分6.4.2[stmt.switch]: 条件应

:

产生错误:

In function ‘int main()’:
error: could not convert ‘yes’ from ‘confirm’ to ‘int’
 case confirm::yes:
               ^
虽然用g++编译,但用clang++编译得很好为什么标记为(2)可能但标记为(3)不可能的赋值


关于
存储空间太小的警告
属于

这看起来像是一个gcc错误,我们可以看到它可以工作:

从草案C++11标准部分
6.4.2
[stmt.switch]:

条件应为整型、枚举型或 将单个非显式转换函数转换为的类类型 存在整数或枚举类型(12.3)。[……]整体促销 都被执行了。switch语句中的任何语句都可以 使用一个或多个案例标签进行标记,如下所示:

case constant-expression :
其中,常量表达式应为开关条件升级类型的转换常量表达式(5.19)

转换后的常量表达式在第
5.19节中介绍,其中说明:

[…]T类型的转换常量表达式是一个文本常量表达式,隐式转换为T类型, 其中,文字常量表达式和隐式转换中允许隐式转换(如果有) 序列仅包含用户定义的转换、左值到右值的转换(4.1)、积分升级(4.5), 和除窄化转换(8.5.4)以外的积分转换(4.7)。[注:可使用此类表达式 作为大小写表达式(6.4.2),作为枚举数初始值设定项(如果基础类型是固定的)(7.2),作为整数或 枚举非类型模板参数(14.3)。-结束说明][…]


也许这与我的工作有关。因此,可能是因为它强制升级到int,然后案例中的比较将失败。

这是一个gcc错误”是否足够?(当然有证据表明这是应该被允许的)@Yakk:有doubt@dyp:感谢标记,但有一个问题仅针对
枚举类
-C++11;在以前的标准中没有这样的问题,我必须在C++11标记和一些其他标记(最多5个标记)之间进行选择;我的理由是:[enum class]意味着C++11,因此从标记中可以清楚地看出这是>=C++11。三个[switch statement]、[bit fields]和[enum class]在[g++]中描述了这个问题。我想[c++11]标记在一段时间内会变得多余,不管怎样,我看到很多问题已经在接受c++11答案,而没有[c++11]标记。@dyp我觉得这像是一个bug,最新的gcc只允许一个警告。
case constant-expression :