如何理解c++中在命名空间内部定义的枚举类型enum
how to understand enumerate type enum which is defined inside of a namespace in c++?
enum StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
int main()
{
int testScores[MAX_STUDENTS]; // allocate 6 integers
testScores[STAN] = 76; // still works
return 0;
}
这是有效的。但另一方面,以下代码不起作用。
enum class StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
int main()
{
int testScores[StudentNames::MAX_STUDENTS]; // allocate 6 integers
testScores[StudentNames::STAN] = 76;
return 0;
}
当我编译它时,我得到了以下错误:
$ g++ array2.cpp
array2.cpp: In function ‘int main()’:
array2.cpp:14:46: error: size of array ‘testScores’ has non-integral type ‘StudentNames’
int testScores[StudentNames::MAX_STUDENTS]; // allocate 6 integers
^
array2.cpp:15:34: error: array subscript is not an integer
testScores[StudentNames::STAN] = 76;
我认为这是因为testScores[StudentNames::MAX_STUDENTS]
中的StudentNames::MAX_STUDENTS
不是整数类型,实际上它是c++中的enum类型,对吧?
同样,以下内容有效。
namespace StudentNames
{
enum StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
}
int main()
{
int testScores[StudentNames::MAX_STUDENTS]; // allocate 6 integers
testScores[StudentNames::STAN] = 76;
return 0;
}
我对最后一段代码感到困惑。如有任何意见,我们将不胜感激。
EDIT:我主要关心的是,为什么它在第三段代码中再次工作。
为什么它在第三段代码中再次工作。
原因与第一段代码中的相同:因为enum
s可以隐式转换为其底层类型,即整数。
我认为[第二个例子失败了],因为
StudentNames::MAX_STUDENTS
。。。不是整型的,实际上是c++中的enum类型,对吧?
它的类型为StudentNames
,这是一个枚举类。枚举类不能隐式转换为其基础类型。它们必须显式转换。
此枚举
enum StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
是一个无范围的枚举。根据C++17标准(10.2枚举声明(
10枚举器或无范围枚举的对象的值类型通过积分提升(7.6(转换为整数。
和这个
enum class StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
是一个作用域枚举。本标准先前的报价附有
注意,这种隐式枚举到int的转换不是为作用域枚举:
因此,要将作用域枚举的枚举数转换为整数类型,必须将其显式转换为整数型。
无范围枚举的枚举数可能具有限定类型。这允许指定使用wht枚举的枚举器。考虑以下演示程序。
#include <iostream>
enum Color { Red = 0 };
int main()
{
enum Color { Red = 10 };
std::cout << Color::Red << 'n';
std::cout << ::Color::Red << 'n';
return 0;
}
其输出为
10
0
现在,让我们来看看其中一个枚举将是作用域枚举。在这种情况下,程序将看起来像
#include <iostream>
enum Color { Red = 0 };
int main()
{
enum class Color { Red = 10 };
std::cout << static_cast<int>( Color::Red ) << 'n';
std::cout << ::Color::Red << 'n';
return 0;
}
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- C++:如何在声明枚举类的模板类主体之外定义枚举类?
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- 当在基类中定义枚举时,qml中的Q_ENUM未定义值
- 在 FlatBuffer 中使用自定义枚举
- 在宣布后定义枚举 - 比利亚利
- 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法
- 类型定义枚举"member"
- 使用对其他枚举值的操作定义枚举元素值
- 具有自定义枚举C++类
- 是否可以手动定义枚举类的转换
- 我们可以在函数中定义枚举吗?
- 在类内部的结构中定义枚举
- 在 c++ 中定义枚举类型的静态变量
- 重新定义枚举的比较运算符
- 在类或文件中定义枚举
- 可以根据同一枚举类型中的其他枚举器来定义枚举器吗
- 检查是否已定义枚举成员
- 在哪里定义枚举
- 在类外部使用在类内部声明的类型定义枚举