枚举继承自原始类型

R_K*_*app 16 c++ c++11

这个这个问题来看,我的印象是从原始类型继承会导致编译器错误.但是,以下代码在Ideone上编译并生成预期输出.

#include <iostream>

enum class Test : unsigned short int
{
    TEST, TEST2, TEST3, TEST4
};

int main() {
    // your code goes here
    Test ans = Test::TEST3;

    if(ans == Test::TEST3)
    {
        std::cout << "Here" << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实上,这class也是enum改变前两个问答的答案吗?这是标准定义明确的行为吗?

Tar*_*ama 25

这并不意味着继承,这会选择枚举的基础类型.底层类型是整数类型,用于表示枚举器值.

您可以在此示例中看到差异:

#include <iostream>

enum class tiny : bool {
    one, two   
};

enum class bigger : long {
    some, lots   
};

int main(int argc, char *argv[])
{
    std::cout << sizeof(tiny::one) << '\n';    //prints 1
    std::cout << sizeof(bigger::some) << '\n'; //prints 8
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,您可以指定范围(即class)和未范围的枚举的基础类型.

  • 作为附加注释——选择基础类型还允许您转发声明枚举类,这是使用 C++03 枚举无法执行的新操作之一。绝对是支持的。 (2认同)

Pet*_*ker 7

enum class在C++ 11中添加了允许您指定枚举的基础类型.它重用继承语法作为类比,但它不是继承.

  • “*`enum class` 是在 C++11 中添加的,允许你为枚举指定底层类型。*”不,它不是;C++11 也允许常规的 `enum`s` 这样做。`enum class` 与常规 `enum` 的唯一变化是:1) 需要通过 EC 的名称确定枚举器的范围。2) 禁止隐式转换到基础类类型。 (2认同)
  • 您的声明说,“枚举类”“已添加 [...] 以允许您...”。这意味着这是唯一的或至少是主要的理由。实际上它与“枚举类”无关*特别*。 (2认同)

Jar*_*d42 6

它不是继承,而是指定底层类型的方式。