繁体   English   中英

超出范围的枚举转换是否可以产生基础类型之外的值?

[英]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 << "aha\n";
    }
}

int main()
{
    foo( static_cast<E>(3) );
}

我的问题是:是否可以触发default情况,即该程序是否产生输出?

在将超出范围的整数转换为枚举类型[expr.static.cast] / 10时,N3936中的棘手问题似乎是static_cast的规范:

可以将整数或枚举类型的值显式转换为枚举类型。 如果原始值在枚举值的范围内,则该值不变。 否则,结果值未指定(可能不在该范围内)

粗体文本没有明确说明该值必须仍然在基础类型的范围内,但我想知道它是否打算这样做。

我认为[expr.static.cast] / 10会回答这个问题。 在目前的工作草案中,这是:

可以将整数或枚举类型的值显式转换为完整的枚举类型。 如果原始值在枚举值(7.2)的范围内,则该值不变。 否则,行为未定义。

换句话说,您的程序具有未定义的行为,因为具有固定基础类型的枚举类型的范围(在您的情况下: bool )是该类型的范围。

您的报价的变化受到CWG1766决议的影响问题链接 ); 请注意,该问题被视为缺陷(因此您应该忘记原始措辞)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM