c++ - 如何理解在 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;
我认为这是因为StudentNames::MAX_STUDENTS
intestScores[StudentNames::MAX_STUDENTS]
不是整数类型,实际上它是 c++ 中的枚举类型,对吧?
再次,以下工作。
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;
}
我对最后一段代码感到困惑。任何意见都非常感谢。
编辑:我主要关心的是,为什么它在第三段代码中再次起作用。
解决方案
这个枚举
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 的转换:
因此,要将作用域枚举的枚举类型转换为整数类型,您必须将其显式转换为整数类型。
无范围枚举的枚举可能有一个合格的类型。这允许指定使用什么枚举的枚举数。考虑以下演示程序。
#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;
}
推荐阅读
- r - Error in Random Forest implementation using R
- python - Recompile Python 3.8 with statically linked OpenSSL on Windows
- c# - 从 ASP.NET Core 3 应用程序执行 Linux Shell 命令
- mongodb - MongoDB: Is it possible to combine 2 requests into one?
- python-3.x - how to capture a child pattern in a parent pattern
- mysql - How to count concurrently bookings in sql in time interval per minute by booking type?
- javascript - What is the way to isolate HTML/CSS/Javascript without an iframe?
- javascript - 如何使用 nuxt.js 访问mounted() 中的数据
- python - AttributeError: 'numpy.bool_' object has no attribute 'keys'
- python - 需要帮助将数据框列转换为列表