如何理解c++中在命名空间内部定义的枚举类型enum


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:我主要关心的是,为什么它在第三段代码中再次工作。

为什么它在第三段代码中再次工作。

原因与第一段代码中的相同:因为enums可以隐式转换为其底层类型,即整数。

我认为[第二个例子失败了],因为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;
}

最新更新