0

現在、VisualStudio11ベータ版で遊んでいます。いくつかのフラグを説明するために強く型付けされた列挙型を使用しています

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
4

2 に答える 2

2

厳密に型指定された列挙型は、基になる型がであっても、整数型に暗黙的に変換できません。実行していることを達成するにはuint32_t、明示的にキャストする必要があります。uint32_t

于 2012-05-30T00:38:44.880 に答える
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 との間の明示的な static_casts を除き、いくつかの値チェックを排除するため値が使用されます。

于 2012-05-30T10:38:06.160 に答える