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?
enum class
はclass
の定義ではありません-キーワードの組み合わせを使用して、スコープ付き列挙を定義します。これは完全にclass
からエンティティを分離します。
std::is_class
は、ここでfalse
を正しく返します。 std::is_enum
を使用すると、true
が返されます。
標準から :
enum
のみのenum-keyで宣言された列挙型は対象範囲外の列挙であり、その列挙子は対象外の列挙子です。列挙キーenum class
とenum struct
は意味的に同等です。これらのいずれかで宣言された列挙型はスコープ付き列挙であり、その列挙子はスコープ付き列挙子です。
enum class
が "class
type"であるという言及は、標準のどこにもありません。
class
キーワードにもかかわらず、列挙はクラスではありません。このキーワードは、列挙子が特定のスコープ規則を順守しなければならないことを意味します(また、暗黙的な整数変換を防ぎます)。
キーワードの選択は、新しいタイプによってもたらされる側面によるものです1、およびC++ 11より前の時代にスコープ付き列挙子がどのようにハッキングされて、上記の側面が得られたか:
struct Enum { // could just as well be a class.
enum {
red = 1, blue, green
};
};
修飾名を介してのみ列挙子にアクセスできます。真のスコープ付き列挙のように暗黙的な変換を防ぐことはできませんでしたが。
is_class
は、クラス/構造体の集約タイプを識別するためのものです。