超出范围的枚举转换能否生成基础类型之外的值
Can an out-of-range enum conversion produce a value outside the underlying type?
考虑以下内容:
#include <iostream>
enum class E : bool { A, B };
void foo(E e)
{
switch(e)
{
case E::A: break;
case E::B: break;
default: std::cout << "ahan";
}
}
int main()
{
foo( static_cast<E>(3) );
}
我的问题是:default
的情况是否可以触发,即该程序生成输出?
N3936中棘手的一点似乎是在将超出范围的整数转换为枚举类型[expr.static.cast]/10:时static_cast
的规范
整型或枚举类型的值可以显式转换为枚举类型。如果原始值在枚举值的范围内,则该值保持不变。否则值未指定(可能不在该范围内)。
粗体文本没有明确表示值必须仍在基础类型的范围内,但我想知道它是否有意这样做。
我认为[expr.static.cast]/10回答了这个问题。在目前的工作草案中,这是:
整型或枚举类型的值可以显式转换为完整的枚举类型。如果原始值在枚举值(7.2)的范围内,则该值保持不变。否则,行为未定义
换句话说,您的程序具有未定义的行为,因为具有固定底层类型的枚举类型(在您的情况下为:bool
)的范围就是该类型的范围。
您报价的变更受到CWG1766决议的影响(问题链接);注意,这个问题被认为是一个缺陷(所以你应该忘记原来的措辞)。
相关文章:
- 如何计算数据类型的范围,例如int
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 将超出范围的整数分配给有符号字符类型
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 将使用/类型定义限制为类范围
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- 连接到MS SQL的程序类型超出范围
- C++数据类型 s 及其范围
- 类型大小与其值范围之间的关系?
- C++,"由于数据类型范围有限,比较总是正确的"
- C++中最大的数据类型范围
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 如何计算浮点数据类型的范围、最大值、最小值
- 在 c++ 中确定某个值是否在该数据类型的最大范围内
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 计算类型范围
- 32位或64位操作系统如何影响数据类型范围
- C++方法调用和类型范围解析的歧义
- GCC:由于数据类型范围有限,比较始终为真 - 在模板参数中