超出范围的枚举转换能否生成基础类型之外的值

Can an out-of-range enum conversion produce a value outside the underlying type?

本文关键字:类型 范围 枚举 转换      更新时间:2023-10-16

考虑以下内容:

#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决议的影响(问题链接);注意,这个问题被认为是一个缺陷(所以你应该忘记原来的措辞)。