M.M*_*M.M 15 c++ language-lawyer c++14
考虑以下:
#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) );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以default触发案例,即该程序是否产生输出?
N3936中的棘手问题似乎是static_cast将超出范围的整数转换为枚举类型[expr.static.cast]/10时的规范:
可以将整数或枚举类型的值显式转换为枚举类型.如果原始值在枚举值的范围内,则该值不变.否则,结果值未指定(可能不在该范围内).
粗体文本没有明确说明该值必须仍然在基础类型的范围内,但我想知道它是否打算这样做.
Ker*_* SB 10
我认为[expr.static.cast]/10会回答这个问题.在目前的工作草案中,这是:
可以将整数或枚举类型的值显式转换为完整的枚举类型.如果原始值在枚举值(7.2)的范围内,则该值不变.否则,行为未定义.
换句话说,您的程序具有未定义的行为,因为具有固定基础类型的枚举类型的范围(在您的情况下bool:)是该类型的范围.
您的报价的变化受到CWG1766决议的影响(问题链接); 请注意,该问题被视为缺陷(因此您应该忘记原始措辞).