首页 > 解决方案 > 如何理解在 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_STUDENTSintestScores[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;
}

我对最后一段代码感到困惑。任何意见都非常感谢。

编辑:我主要关心的是,为什么它在第三段代码中再次起作用。

标签: c++

解决方案


这个枚举

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;
}

推荐阅读