web-dev-qa-db-ja.com

「enumクラス」はC ++のクラス型ですか?

cppreference を使用してC++の列挙宣言について読みました。

次に、Enum classを作成し、std::is_classを使用してクラス型かどうかを確認します。

#include <iostream>

enum class Enum 
{
    red = 1, blue, green
};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<Enum>::value << '\n';
}

次に、LinuxプラットフォームでG ++コンパイラをコンパイルして実行し、false値を出力しました。

だからenumクラス型かどうか?enumがクラス型の場合、なぜfalsevalue?

41
msc

enum classclassの定義ではありません-キーワードの組み合わせを使用して、スコープ付き列挙を定義します。これは完全にclassからエンティティを分離します。

std::is_classは、ここでfalseを正しく返します。 std::is_enumを使用すると、trueが返されます。


標準から

enumのみのenum-keyで宣言された列挙型は対象範囲外の列挙であり、その列挙子は対象外の列挙子です。列挙キーenum classenum structは意味的に同等です。これらのいずれかで宣言された列挙型はスコープ付き列挙であり、その列挙子はスコープ付き列挙子です。

enum class "class type"であるという言及は、標準のどこにもありません。

46
Vittorio Romeo

classキーワードにもかかわらず、列挙はクラスではありません。このキーワードは、列挙子が特定のスコープ規則を順守しなければならないことを意味します(また、暗黙的な整数変換を防ぎます)。

キーワードの選択は、新しいタイプによってもたらされる側面によるものです1、およびC++ 11より前の時代にスコープ付き列挙子がどのようにハッキングされて、上記の側面が得られたか:

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};

修飾名を介してのみ列挙子にアクセスできます。真のスコープ付き列挙のように暗黙的な変換を防ぐことはできませんでしたが。

is_classは、クラス/構造体の集約タイプを識別するためのものです。


1 B。Stroustrup-C++ 11 FAQ

22
StoryTeller