c++ - 如何覆盖枚举的积分提升规则?

标签 c++ enums integer-promotion

这与Are C++ enums signed or unsigned?密切相关.根据 JavaMan 的回答,enum 既不是signed 也不是unsigned。但它确实遵循积分提升规则。

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

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

有没有办法覆盖语言的默认行为,将 enums 提升为具体的 signedunsigned 类型? (类似于您可以指定 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
};

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

关于c++ - 如何覆盖枚举的积分提升规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31239247/

相关文章:

c++ - Programm parallel QThread 在应用程序退出时创建内存泄漏

C++ 运行时成员函数按字符串名称访问

c# - 在枚举中使用 DateTime 对象

java - 如何从 JNI 返回枚举

c - C : Whats the rationale behind this particular rule 中的常用算术转换

c++ - 如何在VC++/CLI中实现VB.net中定义的接口(interface)?

c++ - 如何在 C++ 中显示当前#pragma pack 设置?

c# - Enum.Parse 无法转换字符串

c - 整数提升、值位和乘法

c++ - 按位或在转换为 int32 之前