【问题标题】:Why am I allowed to use an incomplete enum class?为什么允许我使用不完整的枚举类?
【发布时间】:2017-07-10 14:53:31
【问题描述】:

为什么下面的代码编译没有任何错误?

enum class Enumeration;
void func()
{
    auto enumeration = static_cast<Enumeration>(2);
    auto value = static_cast<int>(enumeration);
}

【问题讨论】:

标签: c++


【解决方案1】:

它编译是因为编译器在编译时知道Enumeration 的大小(恰好是空的)。

您可以使用以下语法明确地看到它:

 enum class Enumeration : short;

编译器知道关于Enumeration 的所有信息。 Enumeration 是一个opaque-enum-declaration,这也意味着类型是complete,即您可以在其上使用sizeof。如果需要,您可以在以后的重新声明中指定枚举数列表(除非重新声明带有不同的底层类型,显然)。

请注意,由于您使用的是enum class,因此必须使用static_cast

  • 强类型枚举不允许隐式转换为int,但您可以安全地对它们使用static_cast 来检索它们的整数值。

毕竟他们还是enum

Quoting cppreference

范围内的值没有隐式转换 枚举器转为整数类型,尽管 static_cast 可用于 获取枚举器的数值。

更多关于这个主题的信息:How to automatically convert strongly typed enum into int?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多