这与Are C++ enums signed or unsigned?密切相关.根据 JavaMan 的回答,enum
既不是signed
也不是unsigned
。但它确实遵循积分提升规则。
我正在使用一个使用 enums
的库,然后将它们传递给其他类对象,这些对象主要是 unsigned
类型(如 unsigned int
和 size_t
)。由于语言规则,启用 -Wsign-conversion
警告以捕获合法错误会导致大量误报。
这种规则造成了一种难以确保类型安全和发现常见错误的情况。这很难,因为我想避免像 static_cast
这样随意散布在整个代码中的东西。
有没有办法覆盖语言的默认行为,将 enums
提升为具体的 signed
或 unsigned
类型? (类似于您可以指定 char
是有符号还是无符号的方式)。
相关的,该库是在 1990 年代编写的,因此它支持许多较旧的编译器。如果解决方案甚至能解决 C++03 甚至更早的问题,那就太好了。
来自 How to guard move constructors for C++03 and C++11? ,我知道在实践中没有可靠的方法来检测其他 C++ 语言变体何时生效。在使用 -std=c++03
和 -std=c++11
对 Clang 3.5 进行测试时,它一败涂地。
最佳答案
C++03 枚举的底层类型取决于其枚举器值的范围,它提升为底层类型,而不是 int
(C++98 [conv.prom] §4.5/2).
强制枚举作为 unsigned int
的肮脏方法是添加一个只有 unsigned int
可以处理的值。
enum things {
a, b, c,
force_unsigned = -1U
};
关于c++ - 如何覆盖枚举的积分提升规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31239247/