web-dev-qa-db-ja.com

C ++列挙型の基礎となる型は何ですか?

これは他の場所で回答された可能性がありますが、適切な応答が見つかりませんでした。

私はこのコードを持っています:

enum enumWizardPage
{
    WP_NONE = 0x00,  
    WP_CMDID = 0x01,    
    WP_LEAGUES = 0x02,  
    WP_TEAMS = 0x04,    
    WP_COMP = 0x08, 
    WP_DIVISIONS = 0x10,
    WP_FORMULAS = 0x20, 
    WP_FINISHED = 0x40, 
};

これはレガシーであり、いくつかの新しい値を追加して変更する必要があります。問題は、各値が一意のビットである必要があるため、ビットマップに結合されるORの場合があります。

値は#x ## 16進形式を使用して設定されますが、これが格納できる最大値であるかどうか疑問に思っていますか?コードを次のように変更した場合、どのような影響がありますか?

enum enumWizardPage
{
    WP_NONE = 0x0000,  
    WP_CMDID = 0x0001,  
    WP_LEAGUES = 0x0002,    
    WP_TEAMS = 0x0004,  
    WP_COMP = 0x0008,   
    WP_DIVISIONS = 0x0010,
    WP_FORMULAS = 0x0020,   
    WP_FINISHED = 0x0040,   
};
40

から N4659 C++ 7.2/5

基になる型が固定されていない列挙型の場合、基になる型は、列挙型で定義されているすべての列挙子の値を表すことができる整数型です。すべての列挙子の値を表すことができる整数型がない場合、列挙型の形式が正しくありません。列挙型の値がintまたはunsigned intに収まらない場合を除いて、基になる型がintを超えないことを除いて、基になる型として使用される整数型は実装定義です。 enumerator-listが空の場合、基になる型は、列挙に値0の単一の列挙子があるかのようになります。

41

C++ enumの型はenum自体です。その範囲はかなり恣意的ですが、実際には、その基礎となる型はintです。

ただし、使用される場所にかかわらず、暗黙的にintにキャストされます。

C++ 11の変更

これは、型付き列挙型を導入したC++ 11から変更されました。型指定されていないenumは、少なくともintの幅(より大きな値が必要な場合はより広い)として定義されるようになりました。ただし、次のように定義された型付きenumが与えられたとします。

enum name : type {};

タイプnameの列挙には、基礎となるタイプtypeがあります。たとえば、enum : charは、enumではなくcharと同じ幅のintを定義します。

さらに、enumは次のようにスコープを明示的に指定できます。

enum class name : type {
    value = 0,
    // ...
};

(ここでnameは必須ですが、typeはオプションです。)この方法で宣言されたenumは、暗黙的にその基本型にキャストされません(static_cast<>が必要)。値は完全修飾名で参照する必要があります。この例では、valueenum変数に割り当てるには、その変数をname::valueとして参照する必要があります。

49
greyfade

IIRCは、メモリ内ではintとして表されます。しかし、gccにはスイッチ-fshort-enumスペースを節約する必要がある場合、すべての値に適合する最短の整数型にします。他のコンパイラも同様のものを持っています。

1
cube