【发布时间】:2020-08-09 03:39:58
【问题描述】:
枚举类应该是强枚举,因为它们不会隐式地与int 相互转换。例如:
enum class EC { a, b };
但是,当切换这样一个“强枚举”时:
int sw(EC ec) {
switch (ec) {
case EC::a: return 0;
case EC::b: return 1;
}
}
gcc -Wreturn-type-希望我在 switch 中添加一个 default 子句,即使涵盖了所有合法的枚举值:
warning: control reaches end of non-void function [-Wreturn-type]
在旧的(非类)枚举中,这是有道理的,因为任何int 都可能被意外转换为EC。但是我(显然错误地)假设将无效的枚举成员分配给枚举类是 UB。
当编译器意识到像sw 这样的函数覆盖所有可能的路径时,如何使用真正强大的枚举类?当然,我可以添加一个我知道永远不会触发的 default: 分支,但我想确保将来向 EC 添加更多成员将触发警告在开关中。
【问题讨论】:
-
在我的代码中,我放了一个 should never occur
throw std::logic_error("failure");而不是一个 should never occur 返回一个默认值或欺骗值。
标签: c++ switch-statement strong-typing enum-class defensive-programming