这与Are C++ enums signed or unsigned?密切相关。根据JavaMan的回答,enum
既不是signed
也不是unsigned
。但它确实遵循整体促销规则。如何覆盖枚举的积分促销规则?
我与使用enums
图书馆工作,然后将其传递到预期大多unsigned
类型(如unsigned int
和size_t
)其他类对象。由于语言的规则,启用-Wsign-conversion
警告以努力捕捉合法错误导致数量误报。
规则类创造了一种难以确保类型安全并且能够捕捉到常见错误的情况。这很困难,因为我想避免像static_cast
这样的东西在整个代码中洒落。
有没有办法改写enums
为具体的signed
或unsigned
类型的语言默认行为? (类似于您可以指定char
的方式是有符号的还是无符号的)。
相关,该库是在20世纪90年代编写的,因此它支持一些较老的编译器。如果解决方案甚至可以解决C++ 03和更早的问题,那将是非常好的。
从How to guard move constructors for C++03 and C++11?,我知道在实践中没有可靠的方法来检测其他C++语言变体何时生效。在使用-std=c++03
和-std=c++11
进行Clang 3.5测试期间,它的表面平坦下来。
你可以使用C++ 11,你可以修改这个库中的枚举定义? – Praetorian
@Praetorian - 不幸的是,我们不能依赖C++ 11。我们仍然需要支持C++ 03(也可能更早)。好的一面,我可以修改库中的枚举定义。如果需要的话,该图书馆是魏岱的[Crypto ++](http://www.cryptopp.com/)。对不起提早不提供这些信息。 – jww