1

我有一个公开枚举的类。我正在尝试检查 setter 函数中值的有效性,如下所示:

enum abc 
{
   X,
   Y
};

int my_class::set_abc(abc value)
{
   if(static_cast<int>(value) > static_cast<int>(Y))
       return -1;
...
}

有一个类似的检查值是否小于 X。

我看到编译器完全删除了检查。我已经在 Google 上搜索了这个原因,并遇到了很多解释 C++ 中整数转换规则的页面,但我找不到任何关于将枚举转换为整数或检查有效性的说明。

实现此目的的正确方法是什么?

4

3 回答 3

2

测试似乎是任意的Y,所以我会添加一些限制。这也允许您在 min 和 max 之间添加更多元素,而不必关心排序。

enum abc 
{
    ABC_MIN = 0,
    X,
    Y,
    ABC_MAX
};

int my_class::set_abc(abc value)
{
    assert(value > ABC_MIN && value < ABC_MAX);
{
于 2013-10-30T01:29:14.917 回答
1

由于01是 type 的唯一有效值,因此abc传入大于或小于该值的值的人已经调用了未定义的行为来创建它。

您不能轻易地用 C++ 编写代码来检测以前导致 UB 的条件——正如您所观察到的,编译器倾向于根据该语言允许或禁止的内容进行优化。

您可以编写int检查值然后转换为枚举类型的函数的重载,而不必费心检查abc重载,因为避免调用 UB 是其他人的问题。

或者,您可以通过在枚举中添加一些任意附加值来避免您的测试是多余的。然后编译器无法删除它。

于 2013-10-30T01:29:38.520 回答
0

在 C++ 中,您不能在enum没有显式转换的情况下直接将整数分配给变量。

如果您的代码在任何地方都enum使用该类型,那么检查它是否有效是没有意义的。它应该从一开始就有效并且应该保持有效。

但是,如果您的代码将值作为整数获取并且您需要将其转换为enum(或者您可能对值进行一些算术运算enum),那么您应该在该站点验证该值。

于 2013-10-30T04:40:00.113 回答