2

这与Are C++ enums signed or unsigned?. 根据 JavaMan 的回答, an enumis notsigned也不是unsigned。但它确实遵循整体提升规则。

我正在使用一个库,该库使用enums然后将它们传递给其他主要unsigned类型的类对象(如unsigned intsize_t)。由于语言规则,启用-Wsign-conversion警告以捕捉合法错误会导致许多误报。

这种规则创造了一种难以确保类型安全和捕捉常见错误的情况。这很困难,因为我想避免static_cast在整个代码中随意散布之类的东西。

有没有办法覆盖语言的默认行为以提升enums为具体signedunsigned类型?(类似于您可以指定 achar是有符号还是无符号的方式)。


相关的是,该库是在 1990 年代编写的,因此它支持许多较旧的编译器。如果解决方案甚至可以解决 C++03 甚至更早的问题,那就太好了。

如何保护 C++03 和 C++11 的移动构造函数?,我知道在实践中没有可靠的方法来检测其他 C++ 语言变体何时生效。在使用 Clang 3.5-std=c++03-std=c++11.

4

2 回答 2

2

C++03 枚举的基础类型取决于其枚举数的值范围,并且它提升为其基础类型,而不是int(C++98 [conv.prom] §4.5/2)。

强制枚举行为的肮脏方法unsigned int是添加一个只能unsigned int处理的值。

enum things {
    a, b, c,
    force_unsigned = -1U
};

演示:http ://coliru.stacked-crooked.com/a/d3ded108fb5a68bf

于 2015-07-06T07:14:42.770 回答
1

您可以自己滚动enum class

struct safe_enum {
    enum type {
        value1, value2, value3
    };
    type value;

    operator unsigned int ()
        { return value; }
};

safe_enum foo = safe_enum::value1;
unsigned bar = safe_enum::value2;

不幸的是,这失去了 C++03 枚举的“无范围”行为,因此这种最佳实践模式将破坏代码库。此外,将 a 更改enum为 aclass将破坏 ABI,如果这已作为 DLL 提供的话。

于 2015-07-06T07:06:50.793 回答