visual studio 11(beta)中的强类型枚举类

时间:2012-05-30 00:19:28

标签: c++ enums c++11 standards visual-studio-2012

我正在玩Visual Studio 11 Beta。我使用强类型枚举来描述一些标志

enum class A : uint32_t
{
    VAL1 = 1 << 0,
    VAL2 = 1 << 1,
};
uint32_t v = A::VAL1 | A::VAL2;    // Fails

当我尝试将它们组合起来时,我得到以下错误

error C2676: binary '|' : 'A' does not define this operator or a conversion to a type acceptable to the predefined operator

这是编译器的错误还是我根据c ++ 11标准尝试无效的?

我的假设是先前的枚举声明等同于写作

struct A
{
    enum : uint32_t
    {
        VAL1 = 1 << 0,
        VAL2 = 1 << 1,
    };
};
uint32_t v = A::VAL1 | A::VAL2;    // Succeeds, v = 3

2 个答案:

答案 0 :(得分:2)

强类型枚举不可隐式转换为整数类型,即使其基础类型为uint32_t,您需要显式转换为uint32_t以实现您正在做的事情。

答案 1 :(得分:0)

强类型枚举没有任何形式的运算符|。看看那里:http://code.google.com/p/mili/wiki/BitwiseEnums

使用这个仅限标题的库,您可以编写类似

的代码
enum class WeatherFlags {
    cloudy,
    misty,
    sunny,
    rainy
}

void ShowForecast (bitwise_enum <WeatherFlags> flag);

ShowForecast (WeatherFlags::sunny | WeatherFlags::rainy);

添加:无论如何,如果你想要uint32_t值,你必须明确地将bitwise_enum转换为uint32_t,因为它是enum类:限制enum类的整数值,除去显式static_casts之外的一些值检查使用枚举类值。