Is “enum class” a class type in C++?
我使用CPULIST阅读了C++中的枚举声明。
然后我创建了枚举类,并检查它是否是使用std::is_class的类类型。
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <iostream>
enum class Enum
{
red = 1, blue, green
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<Enum>::value << '
';
} |
然后我在Linux平台上用g++编译器编译并运行,它输出false值。
那么,enum类类型是不是?如果枚举是类类型,那么为什么我得到的是假值?
- (en.cppreference.com/w/cpp/types/is_class有您的示例)
- 不,枚举不是类类型,即使在与enum class一起引入时也是如此。
enum class不是class定义-关键字组合用于定义作用域枚举,该枚举是与class完全独立的实体。
std::is_class在此正确返回false。如果使用std::is_enum,则返回true。
根据标准:
The enumeration type declared with an enum-key of only enum is an unscoped enumeration, and its enumerators are unscoped enumerators. The enum-keys enum class and enum struct are semantically equivalent; an enumeration type declared with one of these is a scoped enumeration, and its enumerators are scoped enumerators.
在标准中没有提到enum class是"class"类型。
- "没有提到枚举类在任何地方都是类类型。"但用于在代码中声明它的关键字除外:/
- @威尔:编辑了我的答案,希望能澄清我的意思。
- 这不是你的答案,但更多的是为枚举选择的语法…
- 它是语法还是语义?(我的意思不是说,在口语意义上,如"学究式的")我正在考虑另一个问题,关于typename和class在模板参数的上下文中是同义的,例如enum class EC {}; template TC { typedef std::is_class type; };(TC)的格式很好,但其type::value是错误的。)它将"class"视为关键字(有时?只有?)限定您所引用的类型/上下文。我很想听到它更清楚地表达出来——裁判们只需要描述个别案件。
尽管有class关键字,但枚举不是类。该关键字只意味着枚举器必须遵守某些范围规则(并且还防止隐式整数转换)。
关键字的选择是由于新类型1带来的方面,以及在C++11之前的时代如何将作用域枚举器一起黑客,以获得所述方面:
1 2 3 4 5
| struct Enum { // could just as well be a class.
enum {
red = 1, blue, green
};
}; |
它只允许通过限定名访问枚举器。尽管它没有阻止像真范围枚举那样的隐式转换。
is_class用于标识类/结构聚合类型。
1 B. Stroustrup -C++ 11常见问题解答
- Stroustrup说这是关于关键字的选择:"新枚举是"枚举类",因为它们将传统枚举(名称值)与类的方面(范围成员和转换的缺失)相结合。
- @zett42-无耻地增加了答案。谢谢您!
- 我怀疑它被称为"枚举类"而不是更显式的东西(例如"作用域枚举")的主要原因之一就是为了关键字的重用。向语言中添加新的关键字是一个困难的过程,因为它可能破坏向后兼容性,这就是为什么"final"不是关键字而是标识符的原因。枚举类"非常有意义,并且重新使用了现有的关键字,所以他们也使用了这些关键字。当然,纯粹的猜测:)
- @阿兹科比——我会把钱放在你的赌注上的:)我怀疑事实上,它与现有的成语也有相似之处,这是一个愉快的巧合。